原創|其它|編輯:郝浩|2012-10-19 15:36:10.000|閱讀 1051 次
概述:由于客戶要求圖形的清晰而且要做成于原來的老系統一樣的圖形顯示效果,就試著用ChartDirector 進行圖形繪制,把我繪制的走勢圖主要代碼貼出來,供大家參考。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
最近給客戶做一個B/S架構的證券交易大屏幕軟件,其中用到對證券指數的走勢以及成交量的圖形繪制,由于客戶要求圖形的清晰而且要做成于原來的老系統一樣的圖形顯示效果,就試著用ChartDirector 進行圖形繪制,第一次用看著文檔幫助是挺方便的,CTrl+C、CTrl+V就畫出一個走勢圖,看著和客戶給的效果圖差不多,挺簡單的,可到了想調整細節的時候卻發現怎么都達不到想要的結果,費了很大的勁才最終得到了想要的效果。下面是我繪制的走勢圖主要代碼(有所修改):
using ChartDirector; //生成圖形數據信息,iWidth:與畫布有關的寬度,iHeight:與畫布有關的高度,dlChartData:Y軸數據 private XYChart GetTrendChart( int iWidth, int iHeight,double[] dlChartData) { try { /***********此處代碼僅供參考,個人取得畫第一個點時從Y軸的中心開始,并且對應證券開盤時間******************/ double dlLin = dlChartData[0]; double dlMax = dlChartData[0]; //X軸數據 string[] XData = new string[2880]; for (int i = 0; i < dlChartData.Length; i++) { XData[i] = " "; //取最小數據 if (dlChartData[i] < dlLin) dlLin = dlChartData[i]; //取最大數據 if (dlChartData[i] > dlMax) dlMax = dlChartData[i]; } //繼續給未賦值的數據賦值 for (int i = dlChartData.Length; i < 2880; i++) { XData[i] = " "; } //最小數、最大數相對于第一個點的浮動大小 double dlFir = Math.Abs(m_KPNum - dlLin); double dlSec = Math.Abs(m_KPNum - dlMax); double dlFloat = dlFir > dlSec ? dlFir : dlSec;
/**********************************************/
/*****************開始畫圖***********************/
// 創建圖形對象 XYChart c = new XYChart(iWidth, iHeight); //設置Y軸 double dMin = Math.Round(m_KPNum - dlFloat, 2); double dMax = Math.Round(m_KPNum + dlFloat, 2); if ((dMax - dMin) < dlChartData[0] * 0.5) { dMax = Math.Round(dlChartData[0] + dlChartData[0] * 0.5,2); dMin = Math.Round(dlChartData[0] - dlChartData[0] * 0.5,2); } //設置Y軸的取值范圍 c.yAxis().setDateScale(dMin, dMax); //設置Y軸要顯示的網格線的個數為4 c.yAxis().setLinearScale(dMin, dMax, (dMax - dMin) / 4); //c.yAxis().setLabel();Y軸設置過Label后就不能自動生成曲線圖了,需要自己去添加線層 //c.yAxis().setLabelGap(10);//設置Y軸標簽之間的縫隙 //c.yAxis().setLabelStep((int)(dMax-dMin)/10);//設置Y軸標簽數組的顯示跨度 //c.yAxis().setLabelFormat("{value}%");//格式化標簽顯示內容 ////設置網格上邊和標題下邊的區域大小為(50, 30),字橫向排列,字體為宋體,大小為9 //c.addLegend(50, 30, false, "Arial Bold", 9).setBackground(Chart.Transparent); //設置與Y軸相關的顏色,其中最后一個參數為設置Y軸伸出坐標的小頭的顏色,一般不想要的話就設置成畫布的背景色 c.yAxis().setColors(0xff0000, 0xff0000, 0xff0000, 0); //設置Y軸標簽樣式 c.yAxis().setLabelStyle("simhei.ttf", 8, 0xFFFFFF); //設置Y軸標簽的顏色(前兩個和最后一個顏色各自相同,中間一個為白色) c.yAxis().setMultiFormat(Chart.SelectItemFilter(0), "<*color=23ff45*> {value}"); c.yAxis().setMultiFormat(Chart.SelectItemFilter(1), "<*color=23ff45*> {value}"); c.yAxis().setMultiFormat(Chart.SelectItemFilter(2), "<*color=FFffFF*> {value}"); c.yAxis().setMultiFormat(Chart.SelectItemFilter(3), "<*color=ff2345*> {value}"); c.yAxis().setMultiFormat(Chart.SelectItemFilter(4), "<*color=ff2345*> {value}"); //設置X軸 //為了實現X軸上隔行變實現的效果,添加了幾個標記 c.xAxis().addMark(720,0xff0000);//隔行實線 c.xAxis().addMark(1440, 0xff0000);//隔行實線 c.xAxis().addMark(2160, 0xff0000);//隔行實線 c.xAxis().setColors(0xff0000, 0xff0000, 0xff0000, 0); c.xAxis().setLabelStyle("simhei.ttf", 5, 0xFFFFFF); c.xAxis().setLabels(XData); c.xAxis().setLabelStep(360 //設置標題 c.addTitle(Chart.Top, "上證指數", "Arial", 7.5, 0xffffff, 0x31319c); //繪制曲線圖所需的數據 c.addLineLayer(dlChartData,0xffffff); //設置背景色為白色 橫坐標和縱坐標的網格線顏色,其中參數三和參數四為畫布的顏色,參數八和參數九為設置網格線為虛線(這里需要的為一個枚舉變量) c.setPlotArea(47, 18, iWidth - 50, iHeight - 23, 0, -1, 0xff0000, c.dashLineColor(0xff0000, Chart.DotLine), c.dashLineColor(0xff0000, Chart.DotLine)); //設置背景 c.setBackground(0); return c; } catch (Exception e) { throw e; } }
這個就是用 ChartDirector 實現一個虛線的網格線,并且隔行變實線,Y軸的標簽顯示不同的顏色,X軸顯示的時間為正常的證券交易時間,曲線圖為相應時間對應的數據(在前面注釋部分提過)的圖形,對于ChartDirector畫圖需要掌握它畫圖的原理,就能畫出想要的圖形對應的坐標標簽,以下為提供的一些意見(僅供參考):
1、準備的Y軸的數據數組和X軸的標簽數組建議相對應,這樣才能確定在坐標軸上的某個點的位置是正確的位置。
2、ChartDirector畫出的圖形的起始位置是從X軸的原點開始,如果想要實現從X軸的某個點開始的話需要在X軸標簽數組的前部分補空,在Y軸的數據數組相應的前部分補上Y軸的最小坐標(但會出現斜線上升的情況,這個就不太理想了)。
3、對于X軸圖形的結束位置,需要的話要在數據數組后面部分補上相應的空值,這樣就能使圖形不至于頂到坐標軸的末尾。
4、X軸的標簽數組長度可以大于Y軸,Y軸數據數組長度最好不要大于X軸,因為這樣圖形就會顯示不全。
5、設置Y軸的標簽數據后,就不會自動生成圖形了,需要自己添加圖形層。
6、合理運用 c.xAxis().setLabelStep()這個方法。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:未知