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

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

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

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

VB.NET

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

解決済

vb.net chartで線を引く方法

aki0118aki
aki0118aki

総合スコア2

C#

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

VB.NET

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

1回答

0グッド

1クリップ

5871閲覧

投稿2020/08/18 07:30

前提・実現したいこと

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

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

aki0118aki

2020/08/19 06:25

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

回答1

0

ベストアンサー

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

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

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

C#

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

編集2022/09/17 07:33
TN8001

総合スコア8039

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

VB.NET

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