C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Chartコントロールで一部を塗りつぶすにはどうすれば

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■90244 / inTopicNo.1)  Chartコントロールで一部を塗りつぶすにはどうすれば
  
□投稿者/ あびば (1回)-(2019/02/19(Tue) 20:08:44)

分類:[.NET 全般] 

Chartコントロールで、散布図グラフを作成しており、
グラフの一部の背景の色を変えたいと考えています。

Private Square As New Series("Square")


Square.Points.AddXY(min_x, min_y)
Square.Points.AddXY(min_x, max_y)
Square.Points.AddXY(max_x, max_y)
Square.Points.AddXY(max_x, min_y)


mArea1.ChartType = SeriesChartType.Area
mArea1.BorderWidth = 1
mArea1.BorderColor = Color.FromArgb(50, 255, 0, 0)
mArea1.Color = Color.FromArgb(10, 255, 0, 0)
Chart1.Series.Add(Square)


とすると、所望することができるのですが、
この方法だと、y軸の値が正の領域には色が塗られるのですが、
負の領域には塗られません。

一体、どうすれば負の領域にも色を付けることができますか?


引用返信 編集キー/
■90245 / inTopicNo.2)  Re[1]: Chartコントロールで一部を塗りつぶすにはどうすれば
□投稿者/ Hongliang (753回)-(2019/02/19(Tue) 20:24:22)
データとは無関係に、単純に背景を描きたいのであれば、PrePaintイベントを使って描画するのが良いのではないでしょうか。
引用返信 編集キー/
■90250 / inTopicNo.3)  Re[2]: Chartコントロールで一部を塗りつぶすにはどうすれば
□投稿者/ あびば (3回)-(2019/02/20(Wed) 10:37:21)
ありがとうございます。

そういうことだったんですね。

検索して調べてみたのですが
https://stackoverflow.com/questions/35639069/drawing-on-the-background-of-a-winform-chart-without-overpainting-the-grid/35640034

このページの方法で塗りつぶすことはできました。
しかし、同ページにも書いてあるように
これだとグリッドが上書きされてしまいます。

どのように改良すれば良いでしょうか?


引用返信 編集キー/
■90251 / inTopicNo.4)  Re[3]: Chartコントロールで一部を塗りつぶすにはどうすれば
□投稿者/ Hongliang (754回)-(2019/02/20(Wed) 11:17:39)
2019/02/20(Wed) 11:18:32 編集(投稿者)
PrePaintイベントは様々な描画要素(エリア、系列、凡例など)を描画するたびに呼び出されます。
グリッドは多分エリアが描画していますが、その後で系列等の描画によるPrePaintが発生して
グリッドが消えているのでしょうね。
何の描画要素によるPrePaintの呼び出しなのかは、e.ChartElementで取得できます。
なので
Dim area As ChartArea = TryCast(e.ChartElement, ChartArea)
If Not(area Is Nothing) Then
    ' ここで描画
End If
みたいなことをするといいでしょう。
ちなみに上記のようにすると、
e.ChartGraphics.GetPositionFromAxis( ... )
の代わりに、
area.AxisX.ValueToPixelPosition(value)
のように記述できます。

引用返信 編集キー/
■90253 / inTopicNo.5)  Re[3]: Chartコントロールで一部を塗りつぶすにはどうすれば
□投稿者/ WebSurfer (1770回)-(2019/02/20(Wed) 12:34:20)
No90250 (あびば さん) に返信

> グラフの一部の背景の色を変えたいと考えています。

その「一部」というのが具体的に何でしょう?

参考にしている stackpverflow の質問

> https://stackoverflow.com/questions/35639069/drawing-on-the-background-of-a-winform-chart-without-overpainting-the-grid/35640034

・・・の画像を見ると Plot Area 全体のことのようですが。

Plot Area の一部ではなく Plot Area 全体でよければ ChartArea の BackColor プロ
パティの設定で可能だと思います。

引用返信 編集キー/
■90255 / inTopicNo.6)  Re[4]: Chartコントロールで一部を塗りつぶすにはどうすれば
□投稿者/ あびば (4回)-(2019/02/20(Wed) 14:14:58)
ありがとうございます。

うまくいきました。

ところで、

Dim xMax As Single = CSng(e.ChartGraphics.GetPositionFromAxis("ChartArea1", AxisName.X, Chart1.ChartAreas(0).AxisX.Maximum))
Dim xMin As Single = CSng(e.ChartGraphics.GetPositionFromAxis("ChartArea1", AxisName.X, Chart1.ChartAreas(0).AxisX.Minimum))
Dim yMax As Single = CSng(e.ChartGraphics.GetPositionFromAxis("ChartArea1", AxisName.Y, Chart1.ChartAreas(0).AxisY.Minimum))
Dim yMin As Single = CSng(e.ChartGraphics.GetPositionFromAxis("ChartArea1", AxisName.Y, Chart1.ChartAreas(0).AxisY.Maximum))

Dim Width As Single = xMax - xMin
Dim heigth As Single = yMax - yMin

Dim myRect As New RectangleF(xMin, yMin, Width, heigth)
myRect = e.ChartGraphics.GetAbsoluteRectangle(myRect)


という方法と


Dim xMax As Single = CSng(Chart1.ChartAreas(0).AxisX.ValueToPixelPosition(Chart1.ChartAreas(0).AxisX.Maximum))
Dim xMin As Single = CSng(Chart1.ChartAreas(0).AxisX.ValueToPixelPosition(Chart1.ChartAreas(0).AxisX.Minimum))
Dim yMax As Single = CSng(Chart1.ChartAreas(0).AxisY.ValueToPixelPosition(Chart1.ChartAreas(0).AxisY.Minimum))
Dim yMin As Single = CSng(Chart1.ChartAreas(0).AxisY.ValueToPixelPosition(Chart1.ChartAreas(0).AxisY.Maximum))



Dim Width As Single = xMax - xMin
Dim heigth As Single = yMax - yMin

Dim myRect As New RectangleF(xMin, yMin, Width, heigth)

という方法がありますが、違いはなんでしょうか?

Dim area As ChartArea = TryCast(e.ChartElement, ChartArea)
If Not(area Is Nothing) Then
' ここで描画
End Ifを使わなかったとしても後者の方法は使えると思います。

前者はeを引数としていますが、
使い道があるのでしょうか?


引用返信 編集キー/
■90257 / inTopicNo.7)  Re[5]: Chartコントロールで一部を塗りつぶすにはどうすれば
□投稿者/ Hongliang (755回)-(2019/02/20(Wed) 14:50:08)
・コード量が違います。
・名前で検索するのは相対的に重い処理なので、実行速度にも影響します(実用上は問題ない、誤差程度の差でしょうが)。
・名前で検索だとうっかりコーディングミスして存在しない名前を指定してしまうかも。
・インデックスで検索だとうっかりコーディングミスして(略
・1つ目のはChart1を直接参照しないので、別クラスにイベントハンドラを移動させることもできます。まあ、senderをChartにキャストできますが。
・ちなみに私が提示したコードの場合、Chartに複数のChartAreaを設定した場合の挙動が他と異なります。
・コード量が違います。
引用返信 編集キー/
■90260 / inTopicNo.8)  Re[6]: Chartコントロールで一部を塗りつぶすにはどうすれば
□投稿者/ あびば (5回)-(2019/02/21(Thu) 10:02:41)
ありがとうございます。

納得いたしました。

あともう一つ質問よろしいでしょうか?

横軸が時間(分)になっており、
横軸左端と右端の時間を日時表記で
チャートの左下と右下に表示したいと考えています。

チャート内に文字列を表示するにはどのようにしたら良いですか?




引用返信 編集キー/
■90261 / inTopicNo.9)  Re[6]: Chartコントロールで一部を塗りつぶすにはどうすれば
□投稿者/ WebSurfer (1772回)-(2019/02/21(Thu) 10:03:50)
No90253 に書いたように Plot Area 全体の背景色を設定するなら ChartArea の
BackColor プロパティの設定一行だけで可能です。

以下の Chart Samples の Appearance > Ploting Area Appearance の画像参照。

http://surferonwww.info/BlogEngine/image.axd?picture=2019%2f2%2fPlotArea.jpg

四角形を作って貼り付けて塗りつぶすという操作が必要だとすると、Plot Area
の一部だけに設定するようなケースでしょうか。でも、Plot Area 全体の話であ
れば、迷走している感じがします。
引用返信 編集キー/
■90262 / inTopicNo.10)  Re[7]: Chartコントロールで一部を塗りつぶすにはどうすれば
□投稿者/ あびば (6回)-(2019/02/21(Thu) 10:12:54)
> WebSurfer さん

質問文に書いた通り、一部の色を変えたいのです。
https://stackoverflow.com/questions/35639069/drawing-on-the-background-of-a-winform-chart-without-overpainting-the-grid/35640034
このページをコードをそのままコピーして使うとは言っていません。
そして、色を塗る件は解決いたしました。

あと、文字列の表示方法を教えてください。

引用返信 編集キー/
■90263 / inTopicNo.11)  Re[8]: Chartコントロールで一部を塗りつぶすにはどうすれば
□投稿者/ Hongliang (756回)-(2019/02/21(Thu) 10:29:05)
// 「文字を表示する」はもうトピックタイトルと関係なくなってるので、新たにトピックを立てるべきだと思います。

> 横軸左端と右端の時間を日時表記で
> チャートの左下と右下に表示したいと考えています。
> チャート内に文字列を表示するにはどのようにしたら良いですか?
どこにどんな感じで表示するか次第だと思うので簡単な回答は難しいです。
個人的には、AxisXにカスタムラベルで2行目に出すことをまず考えるかな、って感じですが。
引用返信 編集キー/
■90264 / inTopicNo.12)  Re[9]: Chartコントロールで一部を塗りつぶすにはどうすれば
□投稿者/ あびば (7回)-(2019/02/21(Thu) 10:57:53)
ありがとうございます。
それでは新規にトピックを上げさせていただきます。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ