質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

8148閲覧

vb.net chartで線を引く方法

aki0118aki

総合スコア2

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

1グッド

0クリップ

投稿2020/08/18 07:30

前提・実現したいこと

①図のようにボーダーを直線で引きたいのですが、chartプロパティにそのような設定がなく
困っています。
②積み上げグラフの各項目の間に罫線を引きたいのですが出力できません。
イメージ説明

どなたか解決策をご存じの方おられましたらよろしくお願いいたします。

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aki0118aki

2020/08/19 06:25

そちらはクローズしました。
guest

回答1

0

ベストアンサー

一応理論上はできることが確認できました。
しかしもう一回やれと言われてもできそうにないです^^;

(2)縦線はMajorGridを消して、MinorGridでグラフ間に引くことで簡単に実現できました。
(1)横線が難題でPrePaintとかで引けばいいんでしょうが、よくわからないので無理やりグラフで書きました^^;

すみませんがVBに書き直す気力がないので、aki0118akiさんのほうで移植してください^^;
やってることはバカバカしいだけで難しいことはないと思います(疑問点があれば答えます)

cs

1using System.Drawing; 2using System.Linq; 3using System.Windows.Forms; 4using System.Windows.Forms.DataVisualization.Charting; 5 6namespace Questions285551 7{ 8 public partial class Form1 : Form 9 { 10 public Form1() 11 { 12 InitializeComponent(); 13 14 var chart1 = new Chart { Dock = DockStyle.Fill, }; 15 Controls.Add(chart1); 16 17 var chartArea1 = new ChartArea(); 18 chart1.ChartAreas.Add(chartArea1); 19 20 var legend1 = new Legend 21 { 22 Alignment = StringAlignment.Far, 23 Docking = Docking.Top, 24 LegendStyle = LegendStyle.Row, 25 }; 26 chart1.Legends.Add(legend1); 27 28 chart1.Series.Add(new Series("国語") { ChartType = SeriesChartType.StackedColumn, }); 29 chart1.Series.Add(new Series("数学") { ChartType = SeriesChartType.StackedColumn, }); 30 chart1.Series.Add(new Series("英語") { ChartType = SeriesChartType.StackedColumn, }); 31 var borderSeries = new Series("ボーダー") { ChartType = SeriesChartType.Line, XAxisType = AxisType.Secondary }; 32 chart1.Series.Add(borderSeries); 33 34 chartArea1.AxisY.MajorGrid.Enabled = false; 35 36 // 見た目を整えたかったため怪しげな0.5 37 chartArea1.AxisX.Minimum = 0.5; 38 chartArea1.AxisX.Interval = 1; 39 chartArea1.AxisX.IntervalOffset = 0.5; 40 41 42 //縦線 MajorGridを消して MinorGridでグラフ間に引く 43 chartArea1.AxisX.MajorGrid.Enabled = false; 44 chartArea1.AxisX.MinorGrid.Enabled = true; 45 chartArea1.AxisX.MinorGrid.Interval = 1; 46 47 // X軸ラベルがボーダーのせいで数字になってしまったので、ボーダーはAxisX2にまわす(もっとましな手段があるはず) 48 chartArea1.AxisX2.Minimum = 0.5; 49 chartArea1.AxisX2.Interval = 1; 50 chartArea1.AxisX2.MajorGrid.Enabled = false; 51 chartArea1.AxisX2.LabelStyle.Enabled = false; 52 53 54 var seiseki = new int[,] { 55 { 75, 80, 30, 40, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 56 { 75, 60, 60, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 57 { 20, 40, 60, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, 58 }; 59 for(var i = 0; i < seiseki.GetLength(0); i++) 60 { 61 for(var j = 0; j < seiseki.GetLength(1); j++) 62 { 63 var dp = new DataPoint(); 64 dp.SetValueXY(0, seiseki[i, j]); 65 dp.AxisLabel = ((char)('A' + j)).ToString(); 66 chart1.Series[i].Points.Add(dp); 67 } 68 } 69 70 // 人数分+1(最後の0)ないとずれるので注意 71 var border = new int[] { 280, 280, 280, 280, 280, 200, 200, 200, 140, 140, 140, 140, 140, 140, 140, 140, 0 }; 72 var old = border[0]; 73 for(var i = 0; i < border.Length; i++) 74 { 75 if(old != border[i]) // うまく説明できないが点をいっこ伸ばす 76 { 77 old = border[i]; 78 var dp = borderSeries.Points.Last().Clone(); 79 dp.XValue += 1; // ここをコメント化すれば意味がわかる 80 borderSeries.Points.Add(dp); 81 borderSeries.Points.Add(new DataPoint { IsEmpty = true, }); // 線のつながりを切る 82 } 83 84 // 棒グラフが1からになっているので、半分左に寄せる意味で0.5からスタート 85 borderSeries.Points.Add(new DataPoint(i + 0.5, border[i])); 86 } 87 } 88 } 89}

追記 VB版

vb

1Imports System.Windows.Forms.DataVisualization.Charting 2 3Public Class Form1 4 Public Sub New() 5 InitializeComponent() 6 7 Dim chart1 = New Chart With {.Dock = DockStyle.Fill} 8 Controls.Add(chart1) 9 10 Dim chartArea1 = New ChartArea 11 chart1.ChartAreas.Add(chartArea1) 12 13 Dim legend1 = New Legend 14 With legend1 15 .Alignment = StringAlignment.Far 16 .Docking = Docking.Top 17 .LegendStyle = LegendStyle.Row 18 End With 19 chart1.Legends.Add(legend1) 20 21 chart1.Series.Add(New Series("国語") With {.ChartType = SeriesChartType.StackedColumn}) 22 chart1.Series.Add(New Series("数学") With {.ChartType = SeriesChartType.StackedColumn}) 23 chart1.Series.Add(New Series("英語") With {.ChartType = SeriesChartType.StackedColumn}) 24 Dim borderSeries = New Series("ボーダー") With {.ChartType = SeriesChartType.Line, .XAxisType = AxisType.Secondary} 25 chart1.Series.Add(borderSeries) 26 27 chartArea1.AxisY.MajorGrid.Enabled = False 28 29 '見た目を整えたかったため怪しげな0.5 30 chartArea1.AxisX.Minimum = 0.5 31 chartArea1.AxisX.Interval = 1 32 chartArea1.AxisX.IntervalOffset = 0.5 33 34 '縦線 MajorGridを消して MinorGridでグラフ間に引く 35 chartArea1.AxisX.MajorGrid.Enabled = False 36 chartArea1.AxisX.MinorGrid.Enabled = True 37 chartArea1.AxisX.MinorGrid.Interval = 1 38 39 'X軸ラベルがボーダーのせいで数字になってしまったので、ボーダーはAxisX2にまわす(もっとましな手段があるはず) 40 chartArea1.AxisX2.Minimum = 0.5 41 chartArea1.AxisX2.Interval = 1 42 chartArea1.AxisX2.MajorGrid.Enabled = False 43 chartArea1.AxisX2.LabelStyle.Enabled = False 44 45 Dim seiseki = { 46 {75, 80, 30, 40, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 47 {75, 60, 60, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 48 {20, 40, 60, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}} 49 For i = 0 To seiseki.GetUpperBound(0) 50 For j = 0 To seiseki.GetUpperBound(1) 51 Dim dp = New DataPoint 52 dp.SetValueXY(0, seiseki(i, j)) 53 dp.AxisLabel = Chr(Asc("A") + j) 54 chart1.Series(i).Points.Add(dp) 55 Next 56 Next 57 58 '人数分+1(最後の0)ないとずれるので注意 59 Dim border = {280, 280, 280, 280, 280, 200, 200, 200, 140, 140, 140, 140, 140, 140, 140, 140, 0} 60 Dim old = border(0) 61 For i = 0 To border.GetUpperBound(0) 62 If old <> border(i) Then 'うまく説明できないが点をいっこ伸ばす 63 old = border(i) 64 Dim dp = borderSeries.Points.Last().Clone() 65 dp.XValue += 1 'ここをコメント化すれば意味がわかる 66 borderSeries.Points.Add(dp) 67 borderSeries.Points.Add(New DataPoint With {.IsEmpty = True}) '線のつながりを切る 68 End If 69 70 '棒グラフが1からになっているので、半分左に寄せる意味で0.5からスタート 71 borderSeries.Points.Add(New DataPoint(i + 0.5, border(i))) 72 Next 73 End Sub 74End Class

アプリ画像

投稿2020/08/18 20:58

編集2023/07/23 04:28
TN8001

総合スコア9244

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aki0118aki

2020/08/19 06:25

回答ありがとうございます。 すいません。.net初心者で以下の分をVB.netではどのように記載すればよろしいでしょうか? borderSeries.Points.Add(new DataPoint { IsEmpty = true, }); // 線のつながりを切る
TN8001

2020/08/19 08:32 編集

VB版追記しました VB初心者なので変なとこがあるかもしれません^^; データによって目盛りがずれやすいので、最初はグリッド表示のまま確認したほうがいいです。 AxisX AxisX2のMinimum Maximumを定数で入れてしまうのもいいかも入れません。
aki0118aki

2020/08/19 08:46

ありがとうございます。 実装できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問