none
MSChart 如何畫超過Y軸最大值 RRS feed

  • 問題

  • 目前遇到一個狀況客戶希望Y最大是100, 但是裡面的折線圖或是長條圖 如果有超過100要可以畫超過

    不要調整Y的最大值

    2019年10月8日 上午 09:24

所有回覆

  • 這應該只能自己畫了
    2019年10月9日 上午 12:17
  • 有sample code 或是給的提示嗎? 我畫不出來
    2019年10月9日 上午 06:54
  • 現成的套件都可以化超過 100 ,但超過的部分會被繪圖區截掉,所以看起來是斷線。

    你所謂的畫超過 100 若是可以被繪圖區截掉,直接指定 Y 軸最大值即可。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2019年10月9日 下午 12:00
  • 目前遇到一個狀況客戶希望Y最大是100, 但是裡面的折線圖或是長條圖 如果有超過100要可以畫超過
    
    不要調整Y的最大值

    有的時候,要滿足客戶要求的『背後原因』,而不是直接的要求
    客戶要求Y最大是100不能超過,小喵猜,應該是想要在看圖的時候,知道『天花板』在哪
    借而簡單得知超出天花板的『異常』

    如果是這樣子,那麼,要處理的是:

    1.簡單知道『天花板是100』
    2.簡單可以看出『超出天花板的異常』

    如果是醬子的背後原因
    圖表改成

    a.在畫面中,多畫出一條天花板的線(100)
    b.Y軸的最大值,可以隨資料而變(可超過100)

    醬子,不但可以解決Y軸限制的問題,還可以讓客戶『更容易察覺超出天花板的異常』

    如果這樣子處理,是否客戶可以接受呢?

    ^.^a


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...

    2019年10月14日 上午 10:12
    版主
  • 畫天花板的線, 跟直接把scale加大一些 差不多, 他們還是要看到點超過 100 , Chart 最大值是100
    2019年10月18日 上午 10:04
  • 所以,這樣堅持『Y軸最大100,超過100還要畫出來』的背後原因是什麼?

    如果不是為了解決商業上的需求(例如可以快速知道最大值,知道哪個點突破了天花板,突破多少)
    而只是一種莫名的堅持(不管怎樣,反正我就是要Y軸最大100)
    那只能~祝福了~
    把時間放在關注商業邏輯,如何幫助可獲得最大商業利益的人身上~
    因為你花再多的成本幫莫名堅持的人達成他要的,他也無法對公司創造出相對的利益

    但,如果背後有真正這需求的『商業目的』,就提出,針對商業目的來解決。

    ---

    技術,不是為了技術而技術,而是為了能夠輔助解決問題,從而創造出價值
    與您共享

    ^.^a


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...


    2019年10月22日 上午 01:49
    版主
  • 如果你不想自己画,想用mschart解决,那你的图表必须满足以下几个条件。

    1. 尺寸必须是固定的,也就是说长宽不能随窗口改变,必须是固定值。

    2. y的实际最大值必须是固定的,比如最大是150。而且y轴的显示最大值也得是固定的,比如你提到的是100,那这个值不能再变动。

    只有在这种情况下才行。方法就是用事先画好的图片做背景。比如:

    这后面用一幅图片做背景:

    这幅图片按照chart控件的尺寸事先做好。

    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Windows.Forms.DataVisualization.Charting;
    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            private Chart chart1;
            private List<int> m_Data = new List<int>() { 50, 100, 130, 30, 70, 110, 35, 80, 105, 95, 75, 65 };
            private int m_X = 0;
            public Form1()
            {
                InitializeComponent();
                chart1 = new Chart();
                chart1.Size = new Size(500, 500);
                Controls.Add(chart1);
                var area = new ChartArea();
                chart1.ChartAreas.Add(area);
                var series = new Series();
                chart1.Series.Add(series);
                series.Points.DataBindY(m_Data);
                var axis_y = area.AxisY;
                axis_y.Maximum = 150;
                axis_y.Interval = 10;
                axis_y.Enabled = AxisEnabled.False;
                var axis_x = area.AxisX;
                axis_x.MajorGrid.Enabled = false;
                axis_x.Maximum = 6;
                area.BackColor = Color.Transparent;
                area.InnerPlotPosition = new ElementPosition(8.9f, 2.5f, 67.3f, 90.0f);
                chart1.BackImage = Application.StartupPath + @"/axis.png";
                chart1.MouseDown += Chart1_MouseDown;
                chart1.MouseMove += Chart1_MouseMove;
            }
            private void Chart1_MouseDown(object sender, MouseEventArgs e)
            {
                m_X = e.X;
            }
            private void Chart1_MouseMove(object sender, MouseEventArgs e)
            {
                if (e.Button == MouseButtons.Left)
                {
                    var axis_x = chart1.ChartAreas[0].AxisX;
                    var offset = (m_X - e.X) / 100.0;
                    m_X = e.X;
                    var min = axis_x.Minimum + offset;
                    if (min >= 0)
                    {
                        var max = axis_x.Maximum + offset;
                        if (max <= (m_Data.Count + 1))
                        {
                            axis_x.Minimum = min;
                            axis_x.Maximum = max;
                            axis_x.IntervalOffset -= offset;
                        }
                    }
                }
            }
        }
    }

    这种方式能显示出你所提到的效果,但一旦你要改动尺寸或者数据最大值,那就得全部重做。好处是你不用自己做控件,也不用自己去画图。这种思路供你参考,不过我个人建议能不这么做最好还是不要这么做,除非你这个图表确实很少改动。

    2019年10月22日 上午 10:01