こんにちは。 折れ線グラフを描画し、縦軸基準値に対して横線を引いて、その横線より上に出たエリアを黄色(仮)、下のエリアを青(仮)く塗りたいと考えていますが、上手くいきません。 chart1.Series.Clear(); Series test = new Series(); Series test2 = new Series(); test.ChartType = SeriesChartType.StackedArea; test.Points.AddXY(1, 0); //1,0 test.Points.AddXY(2, 20); //2,20 test.Points.AddXY(3, 40); //3,40 test.Points.AddXY(4, 40); //4,60 test.Points.AddXY(5, 0); //5,0 test.Points.AddXY(6, 0); //6,0 test.Points.AddXY(7, 20); //7,20 test.Points.AddXY(8, 0); //8,0 test2.ChartType = SeriesChartType.StackedArea; test2.Points.AddXY(1, 0); //1,0 test2.Points.AddXY(2, 0); //2,20 test2.Points.AddXY(3, 0); //3,40 test2.Points.AddXY(4, 20); //4,60 test2.Points.AddXY(5, 0); //5,0 test2.Points.AddXY(6, 0); //6,0 test2.Points.AddXY(7, 0); //7,20 test2.Points.AddXY(8, 0); //8,0 chart1.Series.Add(test); chart1.Series.Add(test2); (まだ基準値の横棒が引けていませんが40を基準値としています)積み上げで試してみたのですが、 横軸4と5の間の部分が40以下なのに黄色エリアが表示されてしまっています。 この部分も青くしたいのですが、知恵をお貸しください。 画像は理想図です。
■No33916に返信(みそしるさんの記事) > 折れ線グラフを描画し、 目的は「折れ線グラフ」なのですね? > test.ChartType = SeriesChartType.StackedArea; > 積み上げで試してみたのですが、 積み上げ面グラフで表現するのは無理があるかと思います。 添付頂いたイメージ図で言うと、(X=5, Y=0)に向かう最初の下降線は、 橙系統(Series2)が (X=4, Y=60) から開始されていますが 青系統(Series1)は (X=4.36, Y=40) あたりから開始されるわけですし…。 > 縦軸基準値に対して横線を引いて、その横線より > 上に出たエリアを黄色(仮)、下のエリアを青(仮)く > 塗りたいと考えていますが、上手くいきません。 代わりに、こういう表現はどうでしょう。 http://www.vb-user.net/junk/replySamples/2018.07.13.20.52/Graph.png using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; namespace Dobon33916 { public partial class Form1 : Form { public Form1() { InitializeComponent(); chart1.ChartAreas.Clear(); chart1.Legends.Clear(); chart1.Series.Clear(); var ca = chart1.ChartAreas.Add("ChartArea1"); var series1 = chart1.Series.Add("Series1"); series1.ChartType = SeriesChartType.Area; series1.Color = Color.DarkTurquoise; var points = series1.Points; points.AddXY(1, 0); points.AddXY(2, 20); points.AddXY(3, 40); points.AddXY(4, 60); points.AddXY(5, 0); points.AddXY(6, 0); points.AddXY(7, 20); points.AddXY(8, 0); double standardValue = 40.0; chart1.PrePaint += (sender, e) => { var axX = ca.AxisX; var axY = ca.AxisY; var xLeft = (float)axX.ValueToPixelPosition(axX.Minimum); var xRight = (float)axX.ValueToPixelPosition(axX.Maximum); var yTop = (float)axY.ValueToPixelPosition(axY.Maximum); var yMiddle = (float)axY.ValueToPixelPosition(standardValue); var yBottom = (float)axY.ValueToPixelPosition(axY.Minimum); var rect1 = RectangleF.FromLTRB(xLeft, yTop, xRight, yMiddle); var rect2 = RectangleF.FromLTRB(xLeft, yMiddle, xRight, yBottom); using (var gb1 = new LinearGradientBrush(rect1, Color.FromArgb(128, 220, 220, 128), Color.FromArgb(223, 255, 255, 0), LinearGradientMode.Vertical)) using (var gb2 = new LinearGradientBrush(rect2, Color.FromArgb(210, 0, 14, 209), Color.FromArgb(140, 0, 64, 255), LinearGradientMode.Vertical)) { var g = e.ChartGraphics.Graphics; g.FillRectangle(gb1, rect1); g.FillRectangle(gb2, rect2); } }; } } }
■No33920に返信(みそしるさんの記事) > 目立つようにするべきターゲットはグラフデータのほう 折れ線グラフは、データポイントごとに直線で結ぶだけのものです。 直線の途中で色を変える機能はありませんが、 それぞれの直線ごとに別の色を変えることならできます。 ということで、『途中に分岐点を設ける』しか無い気がします。 using System; using System.Drawing; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; namespace Dobon33916 { public partial class Form1 : Form { public Form1() { InitializeComponent(); chart1.ChartAreas.Clear(); chart1.Legends.Clear(); chart1.Series.Clear(); var ca = chart1.ChartAreas.Add("ChartArea1"); ca.AxisX.Minimum = 1.0; ca.AxisX.Interval = 1.0; var series1 = chart1.Series.Add("Series1"); series1.ChartType = SeriesChartType.Line; series1.Color = Color.RoyalBlue; series1.BorderWidth = 3; var points = series1.Points; double standardValue = 40.0; int i; i = points.AddXY(1, 0); i = points.AddXY(2, 20); i = points.AddXY(3, 40); i = points.AddXY(4, 60); points[i].Color = Color.Gold; i = points.AddXY(5, 0); // X=4 から X=5 に向かう途中の分岐点を求める var a = points[i].YValues[0] - points[i - 1].YValues[0]; var b = points[i].YValues[0] - a * points[i].XValue; var x = (standardValue - b) / a; points.InsertXY(i, x, standardValue); points[i].Color = Color.Gold; points.AddXY(6, 0); points.AddXY(7, 20); points.AddXY(8, 0); } } }