iT邦幫忙

0

在網頁中插入曲線圖

  • 分享至 

  • xImage

如何在網頁中插入曲線圖?我找網路有chartjs、D3等,但大多都沒有講到即時更新的部分。我是初學者,希望有人能夠教學,或是網路教學方式聘請您。
我對HTML、CSS、javascript都有基本的認知。也有寫過簡單的一頁式網站。

看更多先前的討論...收起先前的討論...
wdchiang iT邦新手 2 級 ‧ 2023-10-04 17:11:01 檢舉
你是 php or C#,一般要做到即時都需要呼叫 API,或透過 AJAX 呼叫 Controller 撈資料。
owo飄 iT邦新手 5 級 ‧ 2023-10-04 17:15:58 檢舉
專案是用C#來寫。但我現在是想嘗試看看前端插入曲線圖,並希望他能即時更新。所以即時更新不會在前端部分就寫好嗎??可以大約講解一下即時更新曲線圖的運作方式嗎?
wdchiang iT邦新手 2 級 ‧ 2023-10-04 17:25:04 檢舉
C# 如果是MVC就很簡單,透過 AJAX 去 Controller 撈DB的資料,我找一下 Code ,之前有串過 Chart.js。
owo飄 iT邦新手 5 級 ‧ 2023-10-04 17:28:32 檢舉
是的,專案是用MVC方式來寫。但對於前端部分我還初學。再勞煩您了~
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
wdchiang
iT邦新手 2 級 ‧ 2023-10-05 00:48:46
最佳解答
                <div class="Cell" style="width: 400px">
                    <canvas id="myChart3" width="250" height="125"></canvas>
                </div>
                
    function changeChart3() {

        var jsonData = JSON.stringify({
            Type: "3",
            CurrDate: $("#qryDate").val()
        });

        $.ajax({
            type: "POST",
            url: '@Url.Action("getOperationGoalStatic", "Home")',
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            data: jsonData,
            success: function (result) {
                mData = result.split(';');

                var d = new Date();
                var month = d.getMonth()+1;

                var ar2 = mData.slice(month, month * 2);

                for (i = month; i < month * 2; i++) {
                    delete mData[i];
                }

                var config = {
                    type: 'line',
                    data: {
                        labels: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
                        datasets: [{
                            data: mData,
                            label: "達成率",
                            backgroundColor: "#61D8AB",
                            borderColor: "#61D8AB",
                            fill: false
                        }, {
                            data: ar2,
                            label: "預計目標",
                            backgroundColor: "#F5A7EA",
                            borderColor: "#F5A7EA",
                            fill: false
                        }
                        ]
                    },
                    options: {
                        title: {
                            display: true,
                            text: '目標統計圖表'
                        }
                    }
                };

                var ctx = document.getElementById("myChart3").getContext("2d");
                var myChart = new Chart(ctx, config);
            },
            error: function (xhr) {
                MsgDialog(xhr.responseText);
            }
        });
    }     
    
[HttpPost]
public JsonResult getOperationGoalStatic(string Type, string CurrDate)
{
    HCS.Service.NewService.CommonService commonService = ServiceManager.GetService<HCS.Service.NewService.CommonService>();

    OperTargStatChartModels model;
    IList<OperTargStatChartModels> list;

    model = new OperTargStatChartModels()
    {
        CenterCode = UserInfo.GetCurrent().login_SysType
    };

    string mData = string.Empty;

    list = new List<OperTargStatChartModels>();
    model = commonService.GetOperTargStatChartByKey(model);
    if (model != null)
    {
        list.Add(model);

        string mToday = DateTime.Now.ToShortDateString().Replace("/", "");
        int mMonth = DateTime.Now.Month;

        int[] mGoalMonth = new int[12];
        int[] mTargetMonth = new int[12];
        string mCurrentDate = !string.IsNullOrWhiteSpace(list[0].CurrentDate) ? list[0].CurrentDate.ToString() : "";

        HomeService homeService;

        homeService = ServiceManager.GetService<HomeService>();

        HomeCaseCnt homeCaseCntQuery = new HomeCaseCnt()
        {
            CenterCode = UserInfo.GetCurrent().login_SysType,       //登入的機構代碼。
            CurrentDate = DateTime.Now.Year + "01"   //首頁畫面條件:日期。
        };

        //即時業務狀態
        HomeBusinessStateVM businessStateVM = homeService.GetBusinessState(homeCaseCntQuery);

        mGoalMonth[0] = businessStateVM.GoalAmountByMonth;//本月目標金額
        mTargetMonth[0] = businessStateVM.CurrentAmountByMonth;//本月目前金額

        homeCaseCntQuery = new HomeCaseCnt()
        {
            CenterCode = UserInfo.GetCurrent().login_SysType,       //登入的機構代碼。
            CurrentDate = DateTime.Now.Year + "02"   //首頁畫面條件:日期。
        };

        //即時業務狀態
        businessStateVM = homeService.GetBusinessState(homeCaseCntQuery);

        mGoalMonth[1] = businessStateVM.GoalAmountByMonth;//本月目標金額
        mTargetMonth[1] = businessStateVM.CurrentAmountByMonth;//本月目前金額

        homeCaseCntQuery = new HomeCaseCnt()
        {
            CenterCode = UserInfo.GetCurrent().login_SysType,       //登入的機構代碼。
            CurrentDate = DateTime.Now.Year + "03"   //首頁畫面條件:日期。
        };

        //即時業務狀態
        businessStateVM = homeService.GetBusinessState(homeCaseCntQuery);

        mGoalMonth[2] = businessStateVM.GoalAmountByMonth;//本月目標金額
        mTargetMonth[2] = businessStateVM.CurrentAmountByMonth;//本月目前金額

        homeCaseCntQuery = new HomeCaseCnt()
        {
            CenterCode = UserInfo.GetCurrent().login_SysType,       //登入的機構代碼。
            CurrentDate = DateTime.Now.Year + "04"   //首頁畫面條件:日期。
        };

        //即時業務狀態
        businessStateVM = homeService.GetBusinessState(homeCaseCntQuery);

        mGoalMonth[3] = businessStateVM.GoalAmountByMonth;//本月目標金額
        mTargetMonth[3] = businessStateVM.CurrentAmountByMonth;//本月目前金額

        homeCaseCntQuery = new HomeCaseCnt()
        {
            CenterCode = UserInfo.GetCurrent().login_SysType,       //登入的機構代碼。
            CurrentDate = DateTime.Now.Year + "05"   //首頁畫面條件:日期。
        };

        //即時業務狀態
        businessStateVM = homeService.GetBusinessState(homeCaseCntQuery);

        mGoalMonth[4] = businessStateVM.GoalAmountByMonth;//本月目標金額
        mTargetMonth[4] = businessStateVM.CurrentAmountByMonth;//本月目前金額

        homeCaseCntQuery = new HomeCaseCnt()
        {
            CenterCode = UserInfo.GetCurrent().login_SysType,       //登入的機構代碼。
            CurrentDate = DateTime.Now.Year + "06"   //首頁畫面條件:日期。
        };

        //即時業務狀態
        businessStateVM = homeService.GetBusinessState(homeCaseCntQuery);

        mGoalMonth[5] = businessStateVM.GoalAmountByMonth;//本月目標金額
        mTargetMonth[5] = businessStateVM.CurrentAmountByMonth;//本月目前金額

        homeCaseCntQuery = new HomeCaseCnt()
        {
            CenterCode = UserInfo.GetCurrent().login_SysType,       //登入的機構代碼。
            CurrentDate = DateTime.Now.Year + "07"   //首頁畫面條件:日期。
        };

        //即時業務狀態
        businessStateVM = homeService.GetBusinessState(homeCaseCntQuery);

        mGoalMonth[6] = businessStateVM.GoalAmountByMonth;//本月目標金額
        mTargetMonth[6] = businessStateVM.CurrentAmountByMonth;//本月目前金額

        if ( mMonth >= 8 )
        {
            homeCaseCntQuery = new HomeCaseCnt()
            {
                CenterCode = UserInfo.GetCurrent().login_SysType,       //登入的機構代碼。
                CurrentDate = DateTime.Now.Year + "08"   //首頁畫面條件:日期。
            };

            //即時業務狀態
            businessStateVM = homeService.GetBusinessState(homeCaseCntQuery);

            mGoalMonth[7] = businessStateVM.GoalAmountByMonth;//本月目標金額
            mTargetMonth[7] = businessStateVM.CurrentAmountByMonth;//本月目前金額
        }

        if (mMonth >= 9)
        {
            homeCaseCntQuery = new HomeCaseCnt()
            {
                CenterCode = UserInfo.GetCurrent().login_SysType,       //登入的機構代碼。
                CurrentDate = DateTime.Now.Year + "09"   //首頁畫面條件:日期。
            };

            //即時業務狀態
            businessStateVM = homeService.GetBusinessState(homeCaseCntQuery);

            mGoalMonth[8] = businessStateVM.GoalAmountByMonth;//本月目標金額
            mTargetMonth[8] = businessStateVM.CurrentAmountByMonth;//本月目前金額
        }

        if (mMonth >= 10)
        {
            homeCaseCntQuery = new HomeCaseCnt()
            {
                CenterCode = UserInfo.GetCurrent().login_SysType,       //登入的機構代碼。
                CurrentDate = DateTime.Now.Year + "10"   //首頁畫面條件:日期。
            };

            //即時業務狀態
            businessStateVM = homeService.GetBusinessState(homeCaseCntQuery);

            mGoalMonth[9] = businessStateVM.GoalAmountByMonth;//本月目標金額
            mTargetMonth[9] = businessStateVM.CurrentAmountByMonth;//本月目前金額
        }

        if (mMonth >= 11)
        {
            homeCaseCntQuery = new HomeCaseCnt()
            {
                CenterCode = UserInfo.GetCurrent().login_SysType,       //登入的機構代碼。
                CurrentDate = DateTime.Now.Year + "11"   //首頁畫面條件:日期。
            };

            //即時業務狀態
            businessStateVM = homeService.GetBusinessState(homeCaseCntQuery);

            mGoalMonth[10] = businessStateVM.GoalAmountByMonth;//本月目標金額
            mTargetMonth[10] = businessStateVM.CurrentAmountByMonth;//本月目前金額
        }

        if (mMonth >= 12)
        {
            homeCaseCntQuery = new HomeCaseCnt()
            {
                CenterCode = UserInfo.GetCurrent().login_SysType,       //登入的機構代碼。
                CurrentDate = DateTime.Now.Year + "12"   //首頁畫面條件:日期。
            };

            //即時業務狀態
            businessStateVM = homeService.GetBusinessState(homeCaseCntQuery);

            mGoalMonth[11] = businessStateVM.GoalAmountByMonth;//本月目標金額
            mTargetMonth[11] = businessStateVM.CurrentAmountByMonth;//本月目前金額
        }

        mData = mTargetMonth[0].ToString();

        if (mMonth >= 2)
        {
            mData += ";" + mTargetMonth[1];
        }
        if (mMonth >= 3)
        {
            mData += ";" + mTargetMonth[2];
        }
        if (mMonth >= 4)
        {
            mData += ";" + mTargetMonth[3];
        }
        if (mMonth >= 5)
        {
            mData += ";" + mTargetMonth[4];
        }
        if (mMonth >= 6)
        {
            mData += ";" + mTargetMonth[5];
        }
        if (mMonth >= 7)
        {
            mData += ";" + mTargetMonth[6];
        }
        if (mMonth >= 8)
        {
            mData += ";" + mTargetMonth[7];
        }
        if (mMonth >= 9)
        {
            mData += ";" + mTargetMonth[8];
        }
        if (mMonth >= 10)
        {
            mData += ";" + mTargetMonth[9];
        }
        if (mMonth >= 11)
        {
            mData += ";" + mTargetMonth[10];
        }
        if (mMonth >= 12)
        {
            mData += ";" + mTargetMonth[11];
        }

        mData += ";" + mGoalMonth[0].ToString();

        if (mMonth >= 2)
        {
            mData += ";" + mGoalMonth[1];
        }
        if (mMonth >= 3)
        {
            mData += ";" + mGoalMonth[2];
        }
        if (mMonth >= 4)
        {
            mData += ";" + mGoalMonth[3];
        }
        if (mMonth >= 5)
        {
            mData += ";" + mGoalMonth[4];
        }
        if (mMonth >= 6)
        {
            mData += ";" + mGoalMonth[5];
        }
        if (mMonth >= 7)
        {
            mData += ";" + mGoalMonth[6];
        }
        if (mMonth >= 8)
        {
            mData += ";" + mGoalMonth[7];
        }
        if (mMonth >= 9)
        {
            mData += ";" + mGoalMonth[8];
        }
        if (mMonth >= 10)
        {
            mData += ";" + mGoalMonth[9];
        }
        if (mMonth >= 11)
        {
            mData += ";" + mGoalMonth[10];
        }
        if (mMonth >= 12)
        {
            mData += ";" + mGoalMonth[11];
        }
    }

    return Json(mData);
}    
    

Controller 呼叫 DB 的方式有很多種,直接呼叫 Dapper 是比較簡單

owo飄 iT邦新手 5 級 ‧ 2023-10-05 08:45:42 檢舉

謝謝您~~我研究一下程式碼~

0
janlin002
iT邦好手 1 級 ‧ 2023-10-04 17:59:59

即時更新的部分,資料應該都是要跟後端要吧,前端能做的就是設計好接口,當後端資料進來以後,馬上繪製一張新的曲線圖,渲染到畫面上,看起來就是即時更新,至於什麼時候該打 api 拿資料就看專案需求了

owo飄 iT邦新手 5 級 ‧ 2023-10-05 08:46:59 檢舉

了解~~我一直以為即時更新部分是由前端發起~謝謝您~

0
海綿寶寶
iT邦大神 1 級 ‧ 2023-10-05 07:18:55

Google 兩篇看看可不可用
Chart.js
D3.js

owo飄 iT邦新手 5 級 ‧ 2023-10-05 08:49:03 檢舉

謝謝您~~~我研究一下內容~

0
PPTaiwan
iT邦好手 1 級 ‧ 2023-10-05 16:21:12

我都用 Highcharts 的圖表來做,有什麼不了解的部份可以直接用 GPT4 來詢問可以解決很多事情

owo飄 iT邦新手 5 級 ‧ 2023-10-12 10:01:34 檢舉

謝謝您,這問題已經解決了~

1
PillMonster
iT邦見習生 ‧ 2023-10-08 10:52:18

我圖表是用Google Chart,並搭配setInterval()方法跟AJAX技術,
setInterval() -> 可以定時執行方法內的內容
AJAX -> 將資料傳給後端,接收後端資料
程式碼如下,您參考看看

// 使用setInterval方法,以固定時間重複執行function()內的內容
   	setInterval(function(){
   		var formData = $('#myForm').serialize(); // 將表單內容序列化為字串
    	$.ajax({
    		url: './viewjsonProductmA', //請求網址
    	  	type: 'POST', //請求方式
    	  	dataType:"json",//接收資料格式 (後端需有標註@ResponseBody的方法)
    	    async:false,//false為非同步
    	  	data: formData,//要傳到後端的資料
    	  	success: function(mAdata) { //如有成功就會取得後端response的資料
    	  	    updateChartmA(mAdata) // 執行業務邏輯及繪製Goole Chart的方法
    	  	},
    	  	error: function(xhr, status, error) {
    		}
    	});	
   	}, 5000); // 每5秒執行一次
    
    // ========== lint chart for mAdata ==========
   	function updateChartmA(mAdata){

        var dataArray = [ ["mA_x_axix", "mA_value"] ]; // 建立數據表存放變數
        
        /*
        執行業務邏輯需求,將資料放入x軸(mA_x_axix)及y軸(mA_value)
        */
	  	
        // array轉換google用的圖表數據
	  	var data = google.visualization.arrayToDataTable(dataArray); 

        // 創建折線圖對象
        var options = {
        	
            curveType: "none", // 折線平滑曲線
            legend: "none", // 取消圖例
                
			titleTextStyle: {
            	fontSize: 14, // 設置標題字體大小
            	bold: true, // 設置標題為粗體
            	italic: false // 設置標題為斜體
            },
 
            hAxis: { // 設置 x 軸
            },
            
            vAxis: { // 設置 y 軸
            },
            

            series: { // 設置圓形點
                0: {
                  pointShape: 'circle', // 設置樣本點為圓形
                  pointSize: 8 // 設置樣本點的大小
                },
            },

            chartArea: { // 設置圖形的位置及大小
                width: '75%', // 圖表區域的寬度
                height: '70%', // 圖表區域的高度
            }, 		
        };
        
        var chart = new google.visualization.LineChart(document.getElementById('mALinePlot'));
        chart.draw(data, options); // 渲染折線圖
   	}
owo飄 iT邦新手 5 級 ‧ 2023-10-12 10:04:06 檢舉

謝謝您提供的程式碼~~

0
oxxo
iT邦研究生 1 級 ‧ 2023-10-12 00:09:16
owo飄 iT邦新手 5 級 ‧ 2023-10-12 10:00:49 檢舉

謝謝您,這問題已經解決了~

我要發表回答

立即登入回答