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

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

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

Re[10]: 複数のChartをひとつに [2]


(過去ログ 134 を表示中)

[トピック内 49 記事 (41 - 49 表示)]  << 0 | 1 | 2 >>

■78818 / inTopicNo.41)  Re[8]: 複数のChartをひとつに
  
□投稿者/ shu (811回)-(2016/02/19(Fri) 07:33:22)
No78816 (佐伯 さん) に返信
> ■No78809 (Jitta さん) に返信
>

>>ラベルの桁数が違うと軸がそろわへんorz AxisYを無効にすればそろうんだけど、いやそれは、、、
> 意味が違ってなければ、
> Chart1.ChartAreas(0).AxisY.LabelStyle.Format = "#,###".PadLeft(6)
> などとして合わせています。
> もちろんもっと良い方法があるのでしょうが。

出来ていたことなのでしょうか?出来ていることは出来ていることで最初から提示された方がよいかと
思います。


>
>>' Y, Height をいじれば重ねられるかと思ったけど、高さが変わると変になった
> これも意味が違ってなければですが、両方のグラフの位置や高さの調整はしたいです。
>
> Chart1全体で動く十字線もありますが、先ずは同じくChart1全体で動くスクロールバーからお願いします。
> 以前の普通にChart1の時には出来てたのですが今回はどうにもなりません(汗;
> すみませんが出来ればHScrollBarではなくChart1に付属したほうがうれしいです。

まずは試した事を提示された方がよいです。Dobonさんのサイトで作成されたスレッドの結果が
どのようになったのかはっきりしていません。ここもDobonさんの掲示板も質問者が解決すればいいという
だけでなく後で他の人が困ったときに助けになるようにという事も目的にされているはずなので
結論はしっかりと質問者の方が書いて閉められた方がよいかと思います。
引用返信 編集キー/
■78826 / inTopicNo.42)  Re[9]: 複数のChartをひとつに
□投稿者/ 佐伯 (22回)-(2016/02/19(Fri) 15:46:19)
No78818 (shu さん) に返信

ありがとうございます。

> 出来ていたことなのでしょうか?出来ていることは出来ていることで最初から提示された方がよいかと
> 思います。
Chart1.ChartAreas(0).AxisY.LabelStyle.Format = "#,###".PadLeft(6)
などでも出来てはいます。
でももっと良い方法があれば教えて頂きたいです。

> まずは試した事を提示された方がよいです。
間違いがあるかもしれませんが下記のが今までのChartです。
ここでの要点はスクロールとマウスの移動と共に引かれる罫線です。
これと同じようなことが教えて頂いた78809でも出来れば嬉しいです。

Imports System.Windows.Forms.DataVisualization.Charting
Public Class Form1
    Private dat1(6) As String
    Private dat2(6) As Single
    Private datS As Integer

    Private posi0 As Double = 1    'Chart1の移動後の横スクロール位置
    Private posi1 As Double = 1    'Chart1の移動前の横スクロール位置

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
        '日付と数量のデータ
        dat1(0) = "0101" : dat1(1) = "0102" : dat1(2) = "0103" : dat1(3) = "0104" : dat1(4) = "0105" : dat1(5) = "0106"
        dat2(0) = "40" : dat2(1) = "20" : dat2(2) = "80" : dat2(3) = "50" : dat2(4) = "70" : dat2(5) = "0"
        datS = 6
        'チャート表示
        Call ChartHyoji()
    End Sub

    'チャート表示
    Private Sub ChartHyoji()
        Dim ds As New DataSet
        Dim dt As New DataTable
        Dim dtRow As DataRow
        '列の作成
        dt.Columns.Add("日付", GetType(String))
        dt.Columns.Add("数量", GetType(Single))
        ds.Tables.Add(dt)
        'データのセット
        For i = 0 To datS
            dtRow = ds.Tables(0).NewRow
            dtRow(0) = dat1(i)  '日付
            dtRow(1) = dat2(i)  '数量
            ds.Tables(0).Rows.Add(dtRow)
        Next
        'Chartに表示するデータソースを設定
        Chart1.DataSource = ds
        '系列を初期化    
        Chart1.Series.Clear()
        'グラフの種類の設定
        Dim bou = Chart1.Series.Add("折れ線")
        With bou
            .ChartType = DataVisualization.Charting.SeriesChartType.Line
            .XValueMember = "日付"
            .YValueMembers = "数量"
            .IsVisibleInLegend = False
        End With

        '横スクロールバーの表示と設定
        Dim sv As AxisScaleView = Chart1.ChartAreas(0).AxisX.ScaleView
        With sv
            .SmallScrollSize = 1          ' ボタンクリック時のスクロール量
            .Position = posi0             ' スクロールバーの初期位置
            .Size = 2                     ' 1画面に表示するデータ数
            If posi0 = 1 Then
                .Position = (datS - .Size) + 1   ' スクロールバーをデータの最終に
            End If
        End With
        'Y軸用の最低数と最高数を算出
        Dim MinSuu As Integer = 999999
        Dim MaxSuu As Integer = 0
        For j As Integer = CInt(posi0 - 1) To CInt(posi0 + sv.Size - 1)
            If MinSuu > dat2(j) Then     '最低数 
                MinSuu = dat2(j)
            End If
            If MaxSuu < dat2(j) Then     '最高数
                MaxSuu = dat2(j)
            End If
        Next
        'Y軸の設定
        Chart1.ChartAreas(0).AxisY.Minimum = MinSuu
        Chart1.ChartAreas(0).AxisY.Maximum = MaxSuu
        Chart1.ChartAreas(0).AxisY.Interval = 10       '目盛りの間隔 
    End Sub

    'Chart1の横スクロールバーの位置を求める
    Private Sub Chart1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles Chart1.Paint
        Dim sv As AxisScaleView = Chart1.ChartAreas(0).AxisX.ScaleView
        posi0 = sv.Position
        If Double.IsNaN(posi0) Then
            posi0 = 1            '初期ポジション
        End If
        If posi1 <> posi0 Then   'スクロール時のみChartを書き換え
            Call ChartHyoji()
            posi1 = posi0
        End If
    End Sub

    'マウス処理 
    Private mp As Point
    Private Sub Chart1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Chart1.MouseMove
        mp = e.Location
        Chart1.Invalidate()
    End Sub

    'x軸とy軸が交差する罫線を引く
    Private Sub Chart1_PostPaint(ByVal sender As Object, ByVal e As System.Windows.Forms.DataVisualization.Charting.ChartPaintEventArgs) Handles Chart1.PostPaint
        Dim gg = e.ChartGraphics.Graphics
        Dim ax = Chart1.ChartAreas(0).AxisX
        Dim ay = Chart1.ChartAreas(0).AxisY
        Dim x1 = ax.ValueToPixelPosition(ax.Minimum)  'グラフ領域左端のX座標
        Dim y1 = ay.ValueToPixelPosition(ay.Maximum)  'グラフ領域上部のY座標
        Dim x2 = ax.ValueToPixelPosition(ax.Maximum)  'グラフ領域右端のX座標
        Dim y2 = ay.ValueToPixelPosition(ay.Minimum)  'グラフ領域下部のY座標
        gg.DrawLine(Pens.Gold, mp.X, CInt(y1), mp.X, CInt(y2))    ' x軸の罫線を引く
        gg.DrawLine(Pens.Gold, CInt(x1), mp.Y, CInt(x2), mp.Y)    ' y軸の罫線を引く 
        '※本当はグラフ外に出れば罫線が引かれないようにもしたいのですが対応が出来てません。
    End Sub
End Class

引用返信 編集キー/
■78827 / inTopicNo.43)  Re[10]: 複数のChartをひとつに
□投稿者/ shu (812回)-(2016/02/19(Fri) 17:30:40)
No78826 (佐伯 さん) に返信

グラフ2個はどのような実装を行っているのでしょうか?


>'※本当はグラフ外に出れば罫線が引かれないようにもしたいのですが対応が出来てません。
ax.Crossing
ay.Crossing
がそれぞれx軸,y軸の交点となるのでこれからPixelに変換すれば(x3,y3とすると)
x3 ≦ mp.x ≦ x2
y1 ≦ mp.y ≦ y3
が描画条件となります。

引用返信 編集キー/
■78830 / inTopicNo.44)  Re[11]: 複数のChartをひとつに
□投稿者/ 佐伯 (23回)-(2016/02/19(Fri) 22:06:11)
2016/02/20(Sat) 16:50:08 編集(投稿者)
No78827 (shu さん) に返信

ありがとうございます。

> グラフ2個はどのような実装を行っているのでしょうか?
すみません。どのような意味でしょうか?

> が描画条件となります。
下記の様にしてみたのですが違ってるようです。
スクロールバーが一番右端にある時はいいのですが、そうではない時には右へ外れてしまいます。

  Dim x3 = ax.ValueToPixelPosition(ax.Crossing)
  Dim y3 = ay.ValueToPixelPosition(ay.Crossing)
  If mp.X >= x3 And mp.X <= x2 Then
      If mp.Y >= y1 And mp.Y <= y3 Then
          gg.DrawLine(Pens.Gold, mp.X, CInt(y1), mp.X, CInt(y2))    ' x軸の罫線を引く
          gg.DrawLine(Pens.Gold, CInt(x1), mp.Y, CInt(x2), mp.Y)    ' y軸の罫線を引く 
      End If
  End If

引用返信 編集キー/
■78919 / inTopicNo.45)  Re[8]: 複数のChartをひとつに
□投稿者/ Jitta (179回)-(2016/02/24(Wed) 06:30:56)
No78816 (佐伯 さん) に返信
すみません、喉腫らして寝込んでましたorz
手洗い、うがい、しっかりしましょう。

> これこれ、これです。
おお、よかったです。

> Chart1.ChartAreas(0).AxisY.LabelStyle.Format = "#,###".PadLeft(6)
あ〜、書式化、頭になかったorz

> 両方のグラフの位置や高さの調整はしたいです。
そうですよね。
一応、いろいろ入れてみたのですが、ChartArea.Position に設定する値は、Chart に対する百分率で指定することになっていました。
先の例では、Chart1.Anchor を Top, Bottom にしたので、フォームの高さを変えると、それに追従するようになっていました。
そのため、Height=50.0F でないと、重なってしまう。。。
あれ?40:60でなんで重なるんだ?サイズ変更毎に再設定しないといけなかったのかな?
そういうわけで、Position.Y と Position.Height を調整すれば、重ねることも可能です。
そうすると、上にある表の X 軸のラベルがじゃまになるのですが、AxisX を disabled にすると、補助線も消えてしまうからなぁ。


> Chart1全体で動く十字線もありますが、先ずは同じくChart1全体で動くスクロールバーからお願いします。
先に示したように、Chart コントロールの中に描画領域(ChartArea)を複数おけるので、Chart コントロールなのか、ChartArea なのか、区別が付くようにしてください。
いちおう、これも見たのですが、ChartArea につきます。
ChartArea というか、ChartArea の Axis で指定します。
なので、ChartArea(0) と ChartArea(1) が別々になります。
まぁ、リファレンスをいろいろ見てください。
その辺が面倒だったので、配置した Panel コントロールに任せました。

引用返信 編集キー/
■78920 / inTopicNo.46)  Re[12]: 複数のChartをひとつに
□投稿者/ shu (817回)-(2016/02/24(Wed) 08:11:14)
No78830 (佐伯 さん) に返信
>
>>が描画条件となります。
> 下記の様にしてみたのですが違ってるようです。
> スクロールバーが一番右端にある時はいいのですが、そうではない時には右へ外れてしまいます。
>
なるほど、そうしたら描画領域の最大のxは分かっていると思うのでそれを使われてはどうでしょう?
間違ってしまって申し訳ありませんが提示されたものをそのまま使って出来ませんでしただけでなく
何らかの対策を行い結果を書かれた方がよいかと思います。
引用返信 編集キー/
■78940 / inTopicNo.47)  Re[13]: 複数のChartをひとつに
□投稿者/ 佐伯 (24回)-(2016/02/24(Wed) 22:39:39)
No78920 (shu さん) に返信

>>が描画条件となります。
>>下記の様にしてみたのですが違ってるようです。
>>スクロールバーが一番右端にある時はいいのですが、そうではない時には右へ外れてしまいます。
>>
> なるほど、そうしたら描画領域の最大のxは分かっていると思うのでそれを使われてはどうでしょう?
> 間違ってしまって申し訳ありませんが提示されたものをそのまま使って出来ませんでしただけでなく
> 何らかの対策を行い結果を書かれた方がよいかと思います。

すみません。
結果報告をしたかったのです。
曖昧な言葉遣いでごめんなさい。


引用返信 編集キー/
■78941 / inTopicNo.48)  Re[9]: 複数のChartをひとつに
□投稿者/ 佐伯 (25回)-(2016/02/24(Wed) 22:54:26)
No78919 (Jitta さん) に返信

寝込んでおられたのですね。
こちらこそすみません。
はい。手洗い、うがい、気をつけます。

教えていただいたこと、
分からぬこともありますが試行錯誤してみます。
ありがとうございます。


引用返信 編集キー/
■78984 / inTopicNo.49)  Re[10]: 複数のChartをひとつに
□投稿者/ 佐伯 (26回)-(2016/02/27(Sat) 22:07:02)
2016/02/27(Sat) 22:08:10 編集(投稿者)

大変お世話になりました。
解決とさせていただきます。
ありがとうございます。

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

<前の20件
トピック内ページ移動 / << 0 | 1 | 2 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -