回答編集履歴

3

見直しキャンペーン中

2023/07/23 04:28

投稿

TN8001
TN8001

スコア9315

test 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

スコア9315

test CHANGED
@@ -1,361 +1,181 @@
1
1
  一応理論上はできることが確認できました。
2
-
3
2
  しかしもう一回やれと言われてもできそうにないです^^;
4
3
 
5
-
6
-
7
4
  (2)縦線は`MajorGrid`を消して、`MinorGrid`でグラフ間に引くことで簡単に実現できました。
8
-
9
5
  (1)横線が難題で`PrePaint`とかで引けばいいんでしょうが、よくわからないので無理やりグラフで書きました^^;
10
6
 
11
-
12
-
13
- ~~~すみませんがVBに書き直す気力がないので、aki0118akiさんのほうで移植してください^^;~~~
7
+ ~~すみませんがVBに書き直す気力がないので、aki0118akiさんのほうで移植してください^^;~~
14
-
15
8
  やってることはバカバカしいだけで難しいことはないと思います(疑問点があれば答えます)
16
9
 
17
-
18
-
19
10
  ```C#
20
-
21
11
  using System.Drawing;
22
-
23
12
  using System.Linq;
24
-
25
13
  using System.Windows.Forms;
26
-
27
14
  using System.Windows.Forms.DataVisualization.Charting;
28
15
 
29
-
30
-
31
16
  namespace Questions285551
32
-
33
17
  {
34
-
35
18
  public partial class Form1 : Form
36
-
37
19
  {
38
-
39
20
  public Form1()
40
-
41
21
  {
42
-
43
22
  InitializeComponent();
44
23
 
45
-
46
-
47
24
  var chart1 = new Chart { Dock = DockStyle.Fill, };
48
-
49
25
  Controls.Add(chart1);
50
26
 
51
-
52
-
53
27
  var chartArea1 = new ChartArea();
54
-
55
28
  chart1.ChartAreas.Add(chartArea1);
56
29
 
57
-
58
-
59
30
  var legend1 = new Legend
60
-
61
31
  {
62
-
63
32
  Alignment = StringAlignment.Far,
64
-
65
33
  Docking = Docking.Top,
66
-
67
34
  LegendStyle = LegendStyle.Row,
68
-
69
35
  };
70
-
71
36
  chart1.Legends.Add(legend1);
72
37
 
73
-
74
-
75
38
  chart1.Series.Add(new Series("国語") { ChartType = SeriesChartType.StackedColumn, });
76
-
77
39
  chart1.Series.Add(new Series("数学") { ChartType = SeriesChartType.StackedColumn, });
78
-
79
40
  chart1.Series.Add(new Series("英語") { ChartType = SeriesChartType.StackedColumn, });
80
-
81
41
  var borderSeries = new Series("ボーダー") { ChartType = SeriesChartType.Line, XAxisType = AxisType.Secondary };
82
-
83
42
  chart1.Series.Add(borderSeries);
84
-
85
-
86
43
 
87
44
  chartArea1.AxisY.MajorGrid.Enabled = false;
88
45
 
89
-
90
-
91
46
  // 見た目を整えたかったため怪しげな0.5
92
-
93
47
  chartArea1.AxisX.Minimum = 0.5;
94
-
95
48
  chartArea1.AxisX.Interval = 1;
96
-
97
49
  chartArea1.AxisX.IntervalOffset = 0.5;
98
50
 
99
51
 
100
-
101
-
102
-
103
52
  //縦線 MajorGridを消して MinorGridでグラフ間に引く
104
-
105
53
  chartArea1.AxisX.MajorGrid.Enabled = false;
106
-
107
54
  chartArea1.AxisX.MinorGrid.Enabled = true;
108
-
109
55
  chartArea1.AxisX.MinorGrid.Interval = 1;
110
56
 
111
-
112
-
113
57
  // X軸ラベルがボーダーのせいで数字になってしまったので、ボーダーはAxisX2にまわす(もっとましな手段があるはず)
114
-
115
58
  chartArea1.AxisX2.Minimum = 0.5;
116
-
117
59
  chartArea1.AxisX2.Interval = 1;
118
-
119
60
  chartArea1.AxisX2.MajorGrid.Enabled = false;
120
-
121
61
  chartArea1.AxisX2.LabelStyle.Enabled = false;
122
62
 
123
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
+ }
124
79
 
125
-
126
-
127
- var seiseki = new int[,] {
80
+ // 人数分+1(最後の0)ないとずれるので注意
128
-
129
- { 75, 80, 30, 40, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
130
-
131
- { 75, 60, 60, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
132
-
133
- { 20, 40, 60, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, },
81
+ var border = new int[] { 280, 280, 280, 280, 280, 200, 200, 200, 140, 140, 140, 140, 140, 140, 140, 140, 0 };
134
-
135
- };
82
+ var old = border[0];
136
-
137
- for(var i = 0; i < seiseki.GetLength(0); i++)
83
+ for(var i = 0; i < border.Length; i++)
138
-
139
84
  {
140
-
141
- for(var j = 0; j < seiseki.GetLength(1); j++)
85
+ if(old != border[i]) // うまく説明できないが点をいっこ伸ばす
142
-
143
86
  {
144
-
87
+ old = border[i];
145
- var dp = new DataPoint();
88
+ var dp = borderSeries.Points.Last().Clone();
146
-
147
- dp.SetValueXY(0, seiseki[i, j]);
148
-
149
- dp.AxisLabel = ((char)('A' + j)).ToString();
89
+ dp.XValue += 1; // ここをコメント化すれば意味がわかる
150
-
151
- chart1.Series[i].Points.Add(dp);
90
+ borderSeries.Points.Add(dp);
152
-
91
+ borderSeries.Points.Add(new DataPoint { IsEmpty = true, }); // 線のつながりを切る
153
92
  }
154
93
 
94
+ // 棒グラフが1からになっているので、半分左に寄せる意味で0.5からスタート
95
+ borderSeries.Points.Add(new DataPoint(i + 0.5, border[i]));
155
96
  }
156
-
157
-
158
-
159
- // 人数分+1(最後の0)ないとずれるので注意
160
-
161
- var border = new int[] { 280, 280, 280, 280, 280, 200, 200, 200, 140, 140, 140, 140, 140, 140, 140, 140, 0 };
162
-
163
- var old = border[0];
164
-
165
- for(var i = 0; i < border.Length; i++)
166
-
167
- {
168
-
169
- if(old != border[i]) // うまく説明できないが点をいっこ伸ばす
170
-
171
- {
172
-
173
- old = border[i];
174
-
175
- var dp = borderSeries.Points.Last().Clone();
176
-
177
- dp.XValue += 1; // ここをコメント化すれば意味がわかる
178
-
179
- borderSeries.Points.Add(dp);
180
-
181
- borderSeries.Points.Add(new DataPoint { IsEmpty = true, }); // 線のつながりを切る
182
-
183
- }
184
-
185
-
186
-
187
- // 棒グラフが1からになっているので、半分左に寄せる意味で0.5からスタート
188
-
189
- borderSeries.Points.Add(new DataPoint(i + 0.5, border[i]));
190
-
191
- }
192
-
193
97
  }
194
-
195
98
  }
196
-
197
99
  }
198
-
199
100
  ```
200
-
201
101
  ---
202
102
 
203
-
204
-
205
103
  追記 VB版
206
-
207
104
  ```VB
208
-
209
105
  Imports System.Windows.Forms.DataVisualization.Charting
210
106
 
211
-
212
-
213
107
  Public Class Form1
214
-
215
108
  Public Sub New()
216
-
217
109
  InitializeComponent()
218
110
 
219
-
220
-
221
111
  Dim chart1 = New Chart With {.Dock = DockStyle.Fill}
222
-
223
112
  Controls.Add(chart1)
224
113
 
225
-
226
-
227
114
  Dim chartArea1 = New ChartArea
228
-
229
115
  chart1.ChartAreas.Add(chartArea1)
230
116
 
231
-
232
-
233
117
  Dim legend1 = New Legend
234
-
235
118
  With legend1
236
-
237
119
  .Alignment = StringAlignment.Far
238
-
239
120
  .Docking = Docking.Top
240
-
241
121
  .LegendStyle = LegendStyle.Row
242
-
243
122
  End With
244
-
245
123
  chart1.Legends.Add(legend1)
246
124
 
247
-
248
-
249
125
  chart1.Series.Add(New Series("国語") With {.ChartType = SeriesChartType.StackedColumn})
250
-
251
126
  chart1.Series.Add(New Series("数学") With {.ChartType = SeriesChartType.StackedColumn})
252
-
253
127
  chart1.Series.Add(New Series("英語") With {.ChartType = SeriesChartType.StackedColumn})
254
-
255
128
  Dim borderSeries = New Series("ボーダー") With {.ChartType = SeriesChartType.Line, .XAxisType = AxisType.Secondary}
256
-
257
129
  chart1.Series.Add(borderSeries)
258
-
259
-
260
130
 
261
131
  chartArea1.AxisY.MajorGrid.Enabled = False
262
132
 
263
-
264
-
265
133
  '見た目を整えたかったため怪しげな0.5
266
-
267
134
  chartArea1.AxisX.Minimum = 0.5
268
-
269
135
  chartArea1.AxisX.Interval = 1
270
-
271
136
  chartArea1.AxisX.IntervalOffset = 0.5
272
137
 
273
-
274
-
275
138
  '縦線 MajorGridを消して MinorGridでグラフ間に引く
276
-
277
139
  chartArea1.AxisX.MajorGrid.Enabled = False
278
-
279
140
  chartArea1.AxisX.MinorGrid.Enabled = True
280
-
281
141
  chartArea1.AxisX.MinorGrid.Interval = 1
282
142
 
283
-
284
-
285
143
  'X軸ラベルがボーダーのせいで数字になってしまったので、ボーダーはAxisX2にまわす(もっとましな手段があるはず)
286
-
287
144
  chartArea1.AxisX2.Minimum = 0.5
288
-
289
145
  chartArea1.AxisX2.Interval = 1
290
-
291
146
  chartArea1.AxisX2.MajorGrid.Enabled = False
292
-
293
147
  chartArea1.AxisX2.LabelStyle.Enabled = False
294
148
 
295
-
296
-
297
149
  Dim seiseki = {
298
-
299
150
  {75, 80, 30, 40, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
300
-
301
151
  {75, 60, 60, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
302
-
303
152
  {20, 40, 60, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}
304
-
305
153
  For i = 0 To seiseki.GetUpperBound(0)
306
-
307
154
  For j = 0 To seiseki.GetUpperBound(1)
308
-
309
155
  Dim dp = New DataPoint
310
-
311
156
  dp.SetValueXY(0, seiseki(i, j))
312
-
313
157
  dp.AxisLabel = Chr(Asc("A") + j)
314
-
315
158
  chart1.Series(i).Points.Add(dp)
316
-
317
159
  Next
318
-
319
160
  Next
320
161
 
321
-
322
-
323
162
  '人数分+1(最後の0)ないとずれるので注意
324
-
325
163
  Dim border = {280, 280, 280, 280, 280, 200, 200, 200, 140, 140, 140, 140, 140, 140, 140, 140, 0}
326
-
327
164
  Dim old = border(0)
328
-
329
165
  For i = 0 To border.GetUpperBound(0)
330
-
331
166
  If old <> border(i) Then 'うまく説明できないが点をいっこ伸ばす
332
-
333
167
  old = border(i)
334
-
335
168
  Dim dp = borderSeries.Points.Last().Clone()
336
-
337
169
  dp.XValue += 1 'ここをコメント化すれば意味がわかる
338
-
339
170
  borderSeries.Points.Add(dp)
340
-
341
171
  borderSeries.Points.Add(New DataPoint With {.IsEmpty = True}) '線のつながりを切る
342
-
343
172
  End If
344
173
 
345
-
346
-
347
174
  '棒グラフが1からになっているので、半分左に寄せる意味で0.5からスタート
348
-
349
175
  borderSeries.Points.Add(New DataPoint(i + 0.5, border(i)))
350
-
351
176
  Next
352
-
353
177
  End Sub
354
-
355
178
  End Class
356
-
357
179
  ```
358
180
 
359
-
360
-
361
181
  ![アプリ画像](11ea8710845cf0401894e44bae4b82b0.png)

1

追記 VB版

2020/08/19 08:31

投稿

TN8001
TN8001

スコア9315

test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- すみませんがVBに書き直す気力がないので、aki0118akiさんのほうで移植してください^^;
13
+ ~~~すみませんがVBに書き直す気力がないので、aki0118akiさんのほうで移植してください^^;~~~
14
14
 
15
15
  やってることはバカバカしいだけで難しいことはないと思います(疑問点があれば答えます)
16
16
 
@@ -198,6 +198,164 @@
198
198
 
199
199
  ```
200
200
 
201
+ ---
202
+
203
+
204
+
205
+ 追記 VB版
206
+
207
+ ```VB
208
+
209
+ Imports System.Windows.Forms.DataVisualization.Charting
210
+
211
+
212
+
213
+ Public Class Form1
214
+
215
+ Public Sub New()
216
+
217
+ InitializeComponent()
218
+
219
+
220
+
221
+ Dim chart1 = New Chart With {.Dock = DockStyle.Fill}
222
+
223
+ Controls.Add(chart1)
224
+
225
+
226
+
227
+ Dim chartArea1 = New ChartArea
228
+
229
+ chart1.ChartAreas.Add(chartArea1)
230
+
231
+
232
+
233
+ Dim legend1 = New Legend
234
+
235
+ With legend1
236
+
237
+ .Alignment = StringAlignment.Far
238
+
239
+ .Docking = Docking.Top
240
+
241
+ .LegendStyle = LegendStyle.Row
242
+
243
+ End With
244
+
245
+ chart1.Legends.Add(legend1)
246
+
247
+
248
+
249
+ chart1.Series.Add(New Series("国語") With {.ChartType = SeriesChartType.StackedColumn})
250
+
251
+ chart1.Series.Add(New Series("数学") With {.ChartType = SeriesChartType.StackedColumn})
252
+
253
+ chart1.Series.Add(New Series("英語") With {.ChartType = SeriesChartType.StackedColumn})
254
+
255
+ Dim borderSeries = New Series("ボーダー") With {.ChartType = SeriesChartType.Line, .XAxisType = AxisType.Secondary}
256
+
257
+ chart1.Series.Add(borderSeries)
258
+
259
+
260
+
261
+ chartArea1.AxisY.MajorGrid.Enabled = False
262
+
263
+
264
+
265
+ '見た目を整えたかったため怪しげな0.5
266
+
267
+ chartArea1.AxisX.Minimum = 0.5
268
+
269
+ chartArea1.AxisX.Interval = 1
270
+
271
+ chartArea1.AxisX.IntervalOffset = 0.5
272
+
273
+
274
+
275
+ '縦線 MajorGridを消して MinorGridでグラフ間に引く
276
+
277
+ chartArea1.AxisX.MajorGrid.Enabled = False
278
+
279
+ chartArea1.AxisX.MinorGrid.Enabled = True
280
+
281
+ chartArea1.AxisX.MinorGrid.Interval = 1
282
+
283
+
284
+
285
+ 'X軸ラベルがボーダーのせいで数字になってしまったので、ボーダーはAxisX2にまわす(もっとましな手段があるはず)
286
+
287
+ chartArea1.AxisX2.Minimum = 0.5
288
+
289
+ chartArea1.AxisX2.Interval = 1
290
+
291
+ chartArea1.AxisX2.MajorGrid.Enabled = False
292
+
293
+ chartArea1.AxisX2.LabelStyle.Enabled = False
294
+
295
+
296
+
297
+ Dim seiseki = {
298
+
299
+ {75, 80, 30, 40, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
300
+
301
+ {75, 60, 60, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
302
+
303
+ {20, 40, 60, 80, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}
304
+
305
+ For i = 0 To seiseki.GetUpperBound(0)
306
+
307
+ For j = 0 To seiseki.GetUpperBound(1)
308
+
309
+ Dim dp = New DataPoint
310
+
311
+ dp.SetValueXY(0, seiseki(i, j))
312
+
313
+ dp.AxisLabel = Chr(Asc("A") + j)
314
+
315
+ chart1.Series(i).Points.Add(dp)
316
+
317
+ Next
318
+
319
+ Next
320
+
321
+
322
+
323
+ '人数分+1(最後の0)ないとずれるので注意
324
+
325
+ Dim border = {280, 280, 280, 280, 280, 200, 200, 200, 140, 140, 140, 140, 140, 140, 140, 140, 0}
326
+
327
+ Dim old = border(0)
328
+
329
+ For i = 0 To border.GetUpperBound(0)
330
+
331
+ If old <> border(i) Then 'うまく説明できないが点をいっこ伸ばす
332
+
333
+ old = border(i)
334
+
335
+ Dim dp = borderSeries.Points.Last().Clone()
336
+
337
+ dp.XValue += 1 'ここをコメント化すれば意味がわかる
338
+
339
+ borderSeries.Points.Add(dp)
340
+
341
+ borderSeries.Points.Add(New DataPoint With {.IsEmpty = True}) '線のつながりを切る
342
+
343
+ End If
344
+
345
+
346
+
347
+ '棒グラフが1からになっているので、半分左に寄せる意味で0.5からスタート
348
+
349
+ borderSeries.Points.Add(New DataPoint(i + 0.5, border(i)))
350
+
351
+ Next
352
+
353
+ End Sub
354
+
355
+ End Class
356
+
357
+ ```
358
+
201
359
 
202
360
 
203
361
  ![アプリ画像](11ea8710845cf0401894e44bae4b82b0.png)