teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

見直しキャンペーン中

2023/07/23 04:28

投稿

TN8001
TN8001

スコア10108

answer CHANGED
@@ -7,7 +7,7 @@
7
7
  ~~すみませんがVBに書き直す気力がないので、aki0118akiさんのほうで移植してください^^;~~
8
8
  やってることはバカバカしいだけで難しいことはないと思います(疑問点があれば答えます)
9
9
 
10
- ```C#
10
+ ```cs
11
11
  using System.Drawing;
12
12
  using System.Linq;
13
13
  using System.Windows.Forms;
@@ -101,7 +101,7 @@
101
101
  ---
102
102
 
103
103
  追記 VB版
104
- ```VB
104
+ ```vb
105
105
  Imports System.Windows.Forms.DataVisualization.Charting
106
106
 
107
107
  Public Class Form1

2

糞リニューアルマークダウン崩れ修正

2022/09/17 07:33

投稿

TN8001
TN8001

スコア10108

answer CHANGED
@@ -1,181 +1,181 @@
1
- 一応理論上はできることが確認できました。
2
- しかしもう一回やれと言われてもできそうにないです^^;
3
-
4
- (2)縦線は`MajorGrid`を消して、`MinorGrid`でグラフ間に引くことで簡単に実現できました。
5
- (1)横線が難題で`PrePaint`とかで引けばいいんでしょうが、よくわからないので無理やりグラフで書きました^^;
6
-
7
- ~~~すみませんがVBに書き直す気力がないので、aki0118akiさんのほうで移植してください^^;~~~
8
- やってることはバカバカしいだけで難しいことはないと思います(疑問点があれば答えます)
9
-
10
- ```C#
11
- using System.Drawing;
12
- using System.Linq;
13
- using System.Windows.Forms;
14
- using System.Windows.Forms.DataVisualization.Charting;
15
-
16
- namespace Questions285551
17
- {
18
- public partial class Form1 : Form
19
- {
20
- public Form1()
21
- {
22
- InitializeComponent();
23
-
24
- var chart1 = new Chart { Dock = DockStyle.Fill, };
25
- Controls.Add(chart1);
26
-
27
- var chartArea1 = new ChartArea();
28
- chart1.ChartAreas.Add(chartArea1);
29
-
30
- var legend1 = new Legend
31
- {
32
- Alignment = StringAlignment.Far,
33
- Docking = Docking.Top,
34
- LegendStyle = LegendStyle.Row,
35
- };
36
- chart1.Legends.Add(legend1);
37
-
38
- chart1.Series.Add(new Series("国語") { ChartType = SeriesChartType.StackedColumn, });
39
- chart1.Series.Add(new Series("数学") { ChartType = SeriesChartType.StackedColumn, });
40
- chart1.Series.Add(new Series("英語") { ChartType = SeriesChartType.StackedColumn, });
41
- var borderSeries = new Series("ボーダー") { ChartType = SeriesChartType.Line, XAxisType = AxisType.Secondary };
42
- chart1.Series.Add(borderSeries);
43
-
44
- chartArea1.AxisY.MajorGrid.Enabled = false;
45
-
46
- // 見た目を整えたかったため怪しげな0.5
47
- chartArea1.AxisX.Minimum = 0.5;
48
- chartArea1.AxisX.Interval = 1;
49
- chartArea1.AxisX.IntervalOffset = 0.5;
50
-
51
-
52
- //縦線 MajorGridを消して MinorGridでグラフ間に引く
53
- chartArea1.AxisX.MajorGrid.Enabled = false;
54
- chartArea1.AxisX.MinorGrid.Enabled = true;
55
- chartArea1.AxisX.MinorGrid.Interval = 1;
56
-
57
- // X軸ラベルがボーダーのせいで数字になってしまったので、ボーダーはAxisX2にまわす(もっとましな手段があるはず)
58
- chartArea1.AxisX2.Minimum = 0.5;
59
- chartArea1.AxisX2.Interval = 1;
60
- chartArea1.AxisX2.MajorGrid.Enabled = false;
61
- chartArea1.AxisX2.LabelStyle.Enabled = false;
62
-
63
-
64
- var seiseki = new int[,] {
65
- { 75, 80, 30, 40, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
66
- { 75, 60, 60, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
67
- { 20, 40, 60, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
68
- };
69
- for(var i = 0; i < seiseki.GetLength(0); i++)
70
- {
71
- for(var j = 0; j < seiseki.GetLength(1); j++)
72
- {
73
- var dp = new DataPoint();
74
- dp.SetValueXY(0, seiseki[i, j]);
75
- dp.AxisLabel = ((char)('A' + j)).ToString();
76
- chart1.Series[i].Points.Add(dp);
77
- }
78
- }
79
-
80
- // 人数分+1(最後の0)ないとずれるので注意
81
- var border = new int[] { 280, 280, 280, 280, 280, 200, 200, 200, 140, 140, 140, 140, 140, 140, 140, 140, 0 };
82
- var old = border[0];
83
- for(var i = 0; i < border.Length; i++)
84
- {
85
- if(old != border[i]) // うまく説明できないが点をいっこ伸ばす
86
- {
87
- old = border[i];
88
- var dp = borderSeries.Points.Last().Clone();
89
- dp.XValue += 1; // ここをコメント化すれば意味がわかる
90
- borderSeries.Points.Add(dp);
91
- borderSeries.Points.Add(new DataPoint { IsEmpty = true, }); // 線のつながりを切る
92
- }
93
-
94
- // 棒グラフが1からになっているので、半分左に寄せる意味で0.5からスタート
95
- borderSeries.Points.Add(new DataPoint(i + 0.5, border[i]));
96
- }
97
- }
98
- }
99
- }
100
- ```
101
- ---
102
-
103
- 追記 VB版
104
- ```VB
105
- Imports System.Windows.Forms.DataVisualization.Charting
106
-
107
- Public Class Form1
108
- Public Sub New()
109
- InitializeComponent()
110
-
111
- Dim chart1 = New Chart With {.Dock = DockStyle.Fill}
112
- Controls.Add(chart1)
113
-
114
- Dim chartArea1 = New ChartArea
115
- chart1.ChartAreas.Add(chartArea1)
116
-
117
- Dim legend1 = New Legend
118
- With legend1
119
- .Alignment = StringAlignment.Far
120
- .Docking = Docking.Top
121
- .LegendStyle = LegendStyle.Row
122
- End With
123
- chart1.Legends.Add(legend1)
124
-
125
- chart1.Series.Add(New Series("国語") With {.ChartType = SeriesChartType.StackedColumn})
126
- chart1.Series.Add(New Series("数学") With {.ChartType = SeriesChartType.StackedColumn})
127
- chart1.Series.Add(New Series("英語") With {.ChartType = SeriesChartType.StackedColumn})
128
- Dim borderSeries = New Series("ボーダー") With {.ChartType = SeriesChartType.Line, .XAxisType = AxisType.Secondary}
129
- chart1.Series.Add(borderSeries)
130
-
131
- chartArea1.AxisY.MajorGrid.Enabled = False
132
-
133
- '見た目を整えたかったため怪しげな0.5
134
- chartArea1.AxisX.Minimum = 0.5
135
- chartArea1.AxisX.Interval = 1
136
- chartArea1.AxisX.IntervalOffset = 0.5
137
-
138
- '縦線 MajorGridを消して MinorGridでグラフ間に引く
139
- chartArea1.AxisX.MajorGrid.Enabled = False
140
- chartArea1.AxisX.MinorGrid.Enabled = True
141
- chartArea1.AxisX.MinorGrid.Interval = 1
142
-
143
- 'X軸ラベルがボーダーのせいで数字になってしまったので、ボーダーはAxisX2にまわす(もっとましな手段があるはず)
144
- chartArea1.AxisX2.Minimum = 0.5
145
- chartArea1.AxisX2.Interval = 1
146
- chartArea1.AxisX2.MajorGrid.Enabled = False
147
- chartArea1.AxisX2.LabelStyle.Enabled = False
148
-
149
- Dim seiseki = {
150
- {75, 80, 30, 40, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
151
- {75, 60, 60, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
152
- {20, 40, 60, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}
153
- For i = 0 To seiseki.GetUpperBound(0)
154
- For j = 0 To seiseki.GetUpperBound(1)
155
- Dim dp = New DataPoint
156
- dp.SetValueXY(0, seiseki(i, j))
157
- dp.AxisLabel = Chr(Asc("A") + j)
158
- chart1.Series(i).Points.Add(dp)
159
- Next
160
- Next
161
-
162
- '人数分+1(最後の0)ないとずれるので注意
163
- Dim border = {280, 280, 280, 280, 280, 200, 200, 200, 140, 140, 140, 140, 140, 140, 140, 140, 0}
164
- Dim old = border(0)
165
- For i = 0 To border.GetUpperBound(0)
166
- If old <> border(i) Then 'うまく説明できないが点をいっこ伸ばす
167
- old = border(i)
168
- Dim dp = borderSeries.Points.Last().Clone()
169
- dp.XValue += 1 'ここをコメント化すれば意味がわかる
170
- borderSeries.Points.Add(dp)
171
- borderSeries.Points.Add(New DataPoint With {.IsEmpty = True}) '線のつながりを切る
172
- End If
173
-
174
- '棒グラフが1からになっているので、半分左に寄せる意味で0.5からスタート
175
- borderSeries.Points.Add(New DataPoint(i + 0.5, border(i)))
176
- Next
177
- End Sub
178
- End Class
179
- ```
180
-
1
+ 一応理論上はできることが確認できました。
2
+ しかしもう一回やれと言われてもできそうにないです^^;
3
+
4
+ (2)縦線は`MajorGrid`を消して、`MinorGrid`でグラフ間に引くことで簡単に実現できました。
5
+ (1)横線が難題で`PrePaint`とかで引けばいいんでしょうが、よくわからないので無理やりグラフで書きました^^;
6
+
7
+ ~~すみませんがVBに書き直す気力がないので、aki0118akiさんのほうで移植してください^^;~~
8
+ やってることはバカバカしいだけで難しいことはないと思います(疑問点があれば答えます)
9
+
10
+ ```C#
11
+ using System.Drawing;
12
+ using System.Linq;
13
+ using System.Windows.Forms;
14
+ using System.Windows.Forms.DataVisualization.Charting;
15
+
16
+ namespace Questions285551
17
+ {
18
+ public partial class Form1 : Form
19
+ {
20
+ public Form1()
21
+ {
22
+ InitializeComponent();
23
+
24
+ var chart1 = new Chart { Dock = DockStyle.Fill, };
25
+ Controls.Add(chart1);
26
+
27
+ var chartArea1 = new ChartArea();
28
+ chart1.ChartAreas.Add(chartArea1);
29
+
30
+ var legend1 = new Legend
31
+ {
32
+ Alignment = StringAlignment.Far,
33
+ Docking = Docking.Top,
34
+ LegendStyle = LegendStyle.Row,
35
+ };
36
+ chart1.Legends.Add(legend1);
37
+
38
+ chart1.Series.Add(new Series("国語") { ChartType = SeriesChartType.StackedColumn, });
39
+ chart1.Series.Add(new Series("数学") { ChartType = SeriesChartType.StackedColumn, });
40
+ chart1.Series.Add(new Series("英語") { ChartType = SeriesChartType.StackedColumn, });
41
+ var borderSeries = new Series("ボーダー") { ChartType = SeriesChartType.Line, XAxisType = AxisType.Secondary };
42
+ chart1.Series.Add(borderSeries);
43
+
44
+ chartArea1.AxisY.MajorGrid.Enabled = false;
45
+
46
+ // 見た目を整えたかったため怪しげな0.5
47
+ chartArea1.AxisX.Minimum = 0.5;
48
+ chartArea1.AxisX.Interval = 1;
49
+ chartArea1.AxisX.IntervalOffset = 0.5;
50
+
51
+
52
+ //縦線 MajorGridを消して MinorGridでグラフ間に引く
53
+ chartArea1.AxisX.MajorGrid.Enabled = false;
54
+ chartArea1.AxisX.MinorGrid.Enabled = true;
55
+ chartArea1.AxisX.MinorGrid.Interval = 1;
56
+
57
+ // X軸ラベルがボーダーのせいで数字になってしまったので、ボーダーはAxisX2にまわす(もっとましな手段があるはず)
58
+ chartArea1.AxisX2.Minimum = 0.5;
59
+ chartArea1.AxisX2.Interval = 1;
60
+ chartArea1.AxisX2.MajorGrid.Enabled = false;
61
+ chartArea1.AxisX2.LabelStyle.Enabled = false;
62
+
63
+
64
+ var seiseki = new int[,] {
65
+ { 75, 80, 30, 40, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
66
+ { 75, 60, 60, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
67
+ { 20, 40, 60, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
68
+ };
69
+ for(var i = 0; i < seiseki.GetLength(0); i++)
70
+ {
71
+ for(var j = 0; j < seiseki.GetLength(1); j++)
72
+ {
73
+ var dp = new DataPoint();
74
+ dp.SetValueXY(0, seiseki[i, j]);
75
+ dp.AxisLabel = ((char)('A' + j)).ToString();
76
+ chart1.Series[i].Points.Add(dp);
77
+ }
78
+ }
79
+
80
+ // 人数分+1(最後の0)ないとずれるので注意
81
+ var border = new int[] { 280, 280, 280, 280, 280, 200, 200, 200, 140, 140, 140, 140, 140, 140, 140, 140, 0 };
82
+ var old = border[0];
83
+ for(var i = 0; i < border.Length; i++)
84
+ {
85
+ if(old != border[i]) // うまく説明できないが点をいっこ伸ばす
86
+ {
87
+ old = border[i];
88
+ var dp = borderSeries.Points.Last().Clone();
89
+ dp.XValue += 1; // ここをコメント化すれば意味がわかる
90
+ borderSeries.Points.Add(dp);
91
+ borderSeries.Points.Add(new DataPoint { IsEmpty = true, }); // 線のつながりを切る
92
+ }
93
+
94
+ // 棒グラフが1からになっているので、半分左に寄せる意味で0.5からスタート
95
+ borderSeries.Points.Add(new DataPoint(i + 0.5, border[i]));
96
+ }
97
+ }
98
+ }
99
+ }
100
+ ```
101
+ ---
102
+
103
+ 追記 VB版
104
+ ```VB
105
+ Imports System.Windows.Forms.DataVisualization.Charting
106
+
107
+ Public Class Form1
108
+ Public Sub New()
109
+ InitializeComponent()
110
+
111
+ Dim chart1 = New Chart With {.Dock = DockStyle.Fill}
112
+ Controls.Add(chart1)
113
+
114
+ Dim chartArea1 = New ChartArea
115
+ chart1.ChartAreas.Add(chartArea1)
116
+
117
+ Dim legend1 = New Legend
118
+ With legend1
119
+ .Alignment = StringAlignment.Far
120
+ .Docking = Docking.Top
121
+ .LegendStyle = LegendStyle.Row
122
+ End With
123
+ chart1.Legends.Add(legend1)
124
+
125
+ chart1.Series.Add(New Series("国語") With {.ChartType = SeriesChartType.StackedColumn})
126
+ chart1.Series.Add(New Series("数学") With {.ChartType = SeriesChartType.StackedColumn})
127
+ chart1.Series.Add(New Series("英語") With {.ChartType = SeriesChartType.StackedColumn})
128
+ Dim borderSeries = New Series("ボーダー") With {.ChartType = SeriesChartType.Line, .XAxisType = AxisType.Secondary}
129
+ chart1.Series.Add(borderSeries)
130
+
131
+ chartArea1.AxisY.MajorGrid.Enabled = False
132
+
133
+ '見た目を整えたかったため怪しげな0.5
134
+ chartArea1.AxisX.Minimum = 0.5
135
+ chartArea1.AxisX.Interval = 1
136
+ chartArea1.AxisX.IntervalOffset = 0.5
137
+
138
+ '縦線 MajorGridを消して MinorGridでグラフ間に引く
139
+ chartArea1.AxisX.MajorGrid.Enabled = False
140
+ chartArea1.AxisX.MinorGrid.Enabled = True
141
+ chartArea1.AxisX.MinorGrid.Interval = 1
142
+
143
+ 'X軸ラベルがボーダーのせいで数字になってしまったので、ボーダーはAxisX2にまわす(もっとましな手段があるはず)
144
+ chartArea1.AxisX2.Minimum = 0.5
145
+ chartArea1.AxisX2.Interval = 1
146
+ chartArea1.AxisX2.MajorGrid.Enabled = False
147
+ chartArea1.AxisX2.LabelStyle.Enabled = False
148
+
149
+ Dim seiseki = {
150
+ {75, 80, 30, 40, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
151
+ {75, 60, 60, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
152
+ {20, 40, 60, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}
153
+ For i = 0 To seiseki.GetUpperBound(0)
154
+ For j = 0 To seiseki.GetUpperBound(1)
155
+ Dim dp = New DataPoint
156
+ dp.SetValueXY(0, seiseki(i, j))
157
+ dp.AxisLabel = Chr(Asc("A") + j)
158
+ chart1.Series(i).Points.Add(dp)
159
+ Next
160
+ Next
161
+
162
+ '人数分+1(最後の0)ないとずれるので注意
163
+ Dim border = {280, 280, 280, 280, 280, 200, 200, 200, 140, 140, 140, 140, 140, 140, 140, 140, 0}
164
+ Dim old = border(0)
165
+ For i = 0 To border.GetUpperBound(0)
166
+ If old <> border(i) Then 'うまく説明できないが点をいっこ伸ばす
167
+ old = border(i)
168
+ Dim dp = borderSeries.Points.Last().Clone()
169
+ dp.XValue += 1 'ここをコメント化すれば意味がわかる
170
+ borderSeries.Points.Add(dp)
171
+ borderSeries.Points.Add(New DataPoint With {.IsEmpty = True}) '線のつながりを切る
172
+ End If
173
+
174
+ '棒グラフが1からになっているので、半分左に寄せる意味で0.5からスタート
175
+ borderSeries.Points.Add(New DataPoint(i + 0.5, border(i)))
176
+ Next
177
+ End Sub
178
+ End Class
179
+ ```
180
+
181
181
  ![アプリ画像](11ea8710845cf0401894e44bae4b82b0.png)

1

追記 VB版

2020/08/19 08:31

投稿

TN8001
TN8001

スコア10108

answer CHANGED
@@ -4,7 +4,7 @@
4
4
  (2)縦線は`MajorGrid`を消して、`MinorGrid`でグラフ間に引くことで簡単に実現できました。
5
5
  (1)横線が難題で`PrePaint`とかで引けばいいんでしょうが、よくわからないので無理やりグラフで書きました^^;
6
6
 
7
- すみませんがVBに書き直す気力がないので、aki0118akiさんのほうで移植してください^^;
7
+ ~~~すみませんがVBに書き直す気力がないので、aki0118akiさんのほうで移植してください^^;~~~
8
8
  やってることはバカバカしいだけで難しいことはないと思います(疑問点があれば答えます)
9
9
 
10
10
  ```C#
@@ -98,5 +98,84 @@
98
98
  }
99
99
  }
100
100
  ```
101
+ ---
101
102
 
103
+ 追記 VB版
104
+ ```VB
105
+ Imports System.Windows.Forms.DataVisualization.Charting
106
+
107
+ Public Class Form1
108
+ Public Sub New()
109
+ InitializeComponent()
110
+
111
+ Dim chart1 = New Chart With {.Dock = DockStyle.Fill}
112
+ Controls.Add(chart1)
113
+
114
+ Dim chartArea1 = New ChartArea
115
+ chart1.ChartAreas.Add(chartArea1)
116
+
117
+ Dim legend1 = New Legend
118
+ With legend1
119
+ .Alignment = StringAlignment.Far
120
+ .Docking = Docking.Top
121
+ .LegendStyle = LegendStyle.Row
122
+ End With
123
+ chart1.Legends.Add(legend1)
124
+
125
+ chart1.Series.Add(New Series("国語") With {.ChartType = SeriesChartType.StackedColumn})
126
+ chart1.Series.Add(New Series("数学") With {.ChartType = SeriesChartType.StackedColumn})
127
+ chart1.Series.Add(New Series("英語") With {.ChartType = SeriesChartType.StackedColumn})
128
+ Dim borderSeries = New Series("ボーダー") With {.ChartType = SeriesChartType.Line, .XAxisType = AxisType.Secondary}
129
+ chart1.Series.Add(borderSeries)
130
+
131
+ chartArea1.AxisY.MajorGrid.Enabled = False
132
+
133
+ '見た目を整えたかったため怪しげな0.5
134
+ chartArea1.AxisX.Minimum = 0.5
135
+ chartArea1.AxisX.Interval = 1
136
+ chartArea1.AxisX.IntervalOffset = 0.5
137
+
138
+ '縦線 MajorGridを消して MinorGridでグラフ間に引く
139
+ chartArea1.AxisX.MajorGrid.Enabled = False
140
+ chartArea1.AxisX.MinorGrid.Enabled = True
141
+ chartArea1.AxisX.MinorGrid.Interval = 1
142
+
143
+ 'X軸ラベルがボーダーのせいで数字になってしまったので、ボーダーはAxisX2にまわす(もっとましな手段があるはず)
144
+ chartArea1.AxisX2.Minimum = 0.5
145
+ chartArea1.AxisX2.Interval = 1
146
+ chartArea1.AxisX2.MajorGrid.Enabled = False
147
+ chartArea1.AxisX2.LabelStyle.Enabled = False
148
+
149
+ Dim seiseki = {
150
+ {75, 80, 30, 40, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
151
+ {75, 60, 60, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
152
+ {20, 40, 60, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}
153
+ For i = 0 To seiseki.GetUpperBound(0)
154
+ For j = 0 To seiseki.GetUpperBound(1)
155
+ Dim dp = New DataPoint
156
+ dp.SetValueXY(0, seiseki(i, j))
157
+ dp.AxisLabel = Chr(Asc("A") + j)
158
+ chart1.Series(i).Points.Add(dp)
159
+ Next
160
+ Next
161
+
162
+ '人数分+1(最後の0)ないとずれるので注意
163
+ Dim border = {280, 280, 280, 280, 280, 200, 200, 200, 140, 140, 140, 140, 140, 140, 140, 140, 0}
164
+ Dim old = border(0)
165
+ For i = 0 To border.GetUpperBound(0)
166
+ If old <> border(i) Then 'うまく説明できないが点をいっこ伸ばす
167
+ old = border(i)
168
+ Dim dp = borderSeries.Points.Last().Clone()
169
+ dp.XValue += 1 'ここをコメント化すれば意味がわかる
170
+ borderSeries.Points.Add(dp)
171
+ borderSeries.Points.Add(New DataPoint With {.IsEmpty = True}) '線のつながりを切る
172
+ End If
173
+
174
+ '棒グラフが1からになっているので、半分左に寄せる意味で0.5からスタート
175
+ borderSeries.Points.Add(New DataPoint(i + 0.5, border(i)))
176
+ Next
177
+ End Sub
178
+ End Class
179
+ ```
180
+
102
181
  ![アプリ画像](11ea8710845cf0401894e44bae4b82b0.png)