web-dev-qa-db-ja.com

MSチャートコントロール2Y軸

カテゴリごとにボリュームごとにアイテムを表示するチャートを作成しています。これまでのところ、単純なx/yチャートであるため、ボリュームでアイテムを表示することに成功していますが、y2を表示したいと思います。また、MS Chart ControlsにはAxisY2が組み込まれていることを知っていますが、それを使って何かを試してみると、チャートが得られます。すべてファンキー。

これが私が探しているものです(アスキーアートで):

item1 |[][][][][].............| cat1
item2 |[][]...................| cat2
item3 |[][....................| cat1
item4 |[][][][][][][][........| cat1
      |_______________________|
        0   1   2   3   4   5

前に述べたように、それは比較的簡単なので、アイテムとカウントをうまく表示することができます。それは私が配置できないように見えるカテゴリです。

ありがとう

12
Brian

最初の短い答え:MSの例によると、それを行う簡単な方法はありませんが、回避策があります:シリーズを2番目のチャートにプロットします(シリーズのコピーを実行することにより)既存のエリアの位置と正確に一致するエリアで、プライマリが表示されませんX/Y軸と表示されているセカンダリY軸(AxisY2)。そして、chartAreaとコピーされたシリーズの背景色を透明に設定します。 (これは、棒グラフではなく縦棒グラフの場合、2次X軸に適用できます)

//Suppose you already have a ChartArea with the series plotted and the left Y Axis
//Add a fake Area where the only appearent thing is your secondary Y Axis
ChartArea area1 = chart.ChartAreas.Add("ChartAreaCopy_" + series.Name);
area1.BackColor = Color.Transparent;
area1.BorderColor = Color.Transparent;
area1.Position.FromRectangleF(area.Position.ToRectangleF());
area1.InnerPlotPosition.FromRectangleF(area.InnerPlotPosition.ToRectangleF());
area1.AxisX.MajorGrid.Enabled = false;
area1.AxisX.MajorTickMark.Enabled = false;
area1.AxisX.LabelStyle.Enabled = false;
area1.AxisY.MajorGrid.Enabled = false;
area1.AxisY.MajorTickMark.Enabled = false;
area1.AxisY.LabelStyle.Enabled = false;

area1.AxisY2.Enabled = AxisEnabled.True;
area1.AxisY2.LabelStyle.Enabled = true;

// Create a copy of specified series, and change Y Values to categories
Series seriesCopy = chart.Series.Add(series.Name + "_Copy");
seriesCopy.ChartType = series.ChartType;
foreach(DataPoint point in series.Points)
{
    double category = getYourItemCategory(point.XValue);
    seriesCopy.Points.AddXY(point.XValue, category);
}

// Hide copied series
seriesCopy.IsVisibleInLegend = false;
seriesCopy.Color = Color.Transparent;
seriesCopy.BorderColor = Color.Transparent;

//Drop it in the chart to make the area show (only the AxisY2 should appear)
seriesCopy.ChartArea = area1.Name;

PS:2泊して、MSチャートコントロールをいじり、チャート領域に2つの異なるY軸を配置しようとしました。 2つの異なるスケールのシリーズ(同じXスケール、異なるYスケール:1つはシリーズAの左側、もう1つはシリーズBの右側)を配置したかったのです。実際、これは非常に簡単であると期待できる場合、これは本当の悪夢であることが証明されました。真実は、MSチャートコントロールは、この特定のユースケースIMHOには絶対に適合していません。 MSCCサンプルの例で提案されている複数のY軸のサンプルは、ひどく非常に醜い回避策です。目的の効果を実現するには、デフォルトのチャート領域の上に2つのチャート領域が必要であり、可視性と透明度で遊んでいます(これは非常に悪い錯覚の魔法のように聞こえます)騙す)。

これが将来のバージョンで適切な方法で強化および修正されることを期待していますが、複数のY軸を管理する効率的な方法が本当に必要な場合は、 ZedGraph に座ってください。

6
Mehdi LAMRANI

これが私のためにそれをしたことです-私がチャートを作成した後、私は次の線を追加しました:

chrtMain.Series[0].YAxisType = AxisType.Primary;
chrtMain.Series[1].YAxisType = AxisType.Secondary;

chrtMain.ChartAreas[0].AxisY2.LineColor = Color.Transparent;
chrtMain.ChartAreas[0].AxisY2.MajorGrid.Enabled = false;
chrtMain.ChartAreas[0].AxisY2.Enabled = AxisEnabled.True;
chrtMain.ChartAreas[0].AxisY2.IsStartedFromZero = chrtMain.ChartAreas[0].AxisY.IsStartedFromZero;

2つのチャートなどを重ね合わせる必要はありませんでした。

31
KTF

それはさらに良くなります:

2番目のY軸を使用する場合、2番目のグラフ領域は必要ありません。 Series.YAxisTypeプロパティを使用して、使用する軸をシリーズごとに決定できます。 http://msdn.Microsoft.com/en-us/library/dd489216.aspx のドキュメントをご覧ください。

マルティン

9

Y軸に必要な数のシリーズを追加できます。以下のコードは、2つ以上のセカンダリy軸を持つ私が使用するチャートからの抜粋です。コードはvb.net用ですが、うまくいくと確信しています。

        ChartKPI.Series.Clear()

        ChartKPI.Series.Add("Series1")
        ChartKPI.Series("Series1").XValueMember = "Date"
        ChartKPI.Series("Series1").YValueMembers = "HSDPA_Vol_MBy"
        ChartKPI.Series("Series1").Name = "HSDPA_Vol_MBy"
        ChartKPI.Series("HSDPA_Vol_MBy").ChartType = SeriesChartType.Column
        ChartKPI.Series("HSDPA_Vol_MBy").ToolTip = "HSDPA MBytes: #VAL"

        ChartKPI.Series.Add("Series2")
        ChartKPI.Series("Series2").YAxisType = AxisType.Secondary
        ChartKPI.Series("Series2").XValueMember = "Date"
        ChartKPI.Series("Series2").YValueMembers = "cs_voice_traffic"
        ChartKPI.Series("Series2").Name = "cs_voice_traffic"
        ChartKPI.Series("cs_voice_traffic").ChartType = SeriesChartType.Line
        ChartKPI.Series("cs_voice_traffic").BorderWidth = 3
        ChartKPI.Series("cs_voice_traffic").ToolTip = "CS Voice Traffic: #VAL"

        ChartKPI.Series.Add("Series3")
        ChartKPI.Series("Series3").YAxisType = AxisType.Secondary
        ChartKPI.Series("Series3").XValueMember = "Date"
        ChartKPI.Series("Series3").YValueMembers = "cs_conv_traffic"
        ChartKPI.Series("Series3").Name = "cs_conv_traffic"
        ChartKPI.Series("cs_conv_traffic").ChartType = SeriesChartType.Line
        ChartKPI.Series("cs_conv_traffic").BorderWidth = 3
        ChartKPI.Series("cs_conv_traffic").ToolTip = "CS Conv Traffic: #VAL"

        ChartKPI.Series.Add("Series4")
        ChartKPI.Series("Series4").YAxisType = AxisType.Secondary
        ChartKPI.Series("Series4").XValueMember = "Date"
        ChartKPI.Series("Series4").YValueMembers = "ps_backg_traffic_ul"
        ChartKPI.Series("Series4").Name = "ps_backg_traffic_ul"
        ChartKPI.Series("ps_backg_traffic_ul").ChartType = SeriesChartType.Line
        ChartKPI.Series("ps_backg_traffic_ul").BorderWidth = 3
        ChartKPI.Series("ps_backg_traffic_ul").ToolTip = "PS Backg Traffic UL: #VAL"

        ChartKPI.Series.Add("Series5")
        ChartKPI.Series("Series5").YAxisType = AxisType.Secondary
        ChartKPI.Series("Series5").XValueMember = "Date"
        ChartKPI.Series("Series5").YValueMembers = "ps_backg_traffic_dl"
        ChartKPI.Series("Series5").Name = "ps_backg_traffic_dl"
        ChartKPI.Series("ps_backg_traffic_dl").ChartType = SeriesChartType.Line
        ChartKPI.Series("ps_backg_traffic_dl").BorderWidth = 3
        ChartKPI.Series("ps_backg_traffic_dl").ToolTip = "PS Backg Traffic DL: #VAL"

        ChartKPI.ChartAreas("ChartArea1").AxisX.Title = "HSDPA Traffic (MB)"
        ChartKPI.ChartAreas("ChartArea1").AxisX.MajorGrid.Interval = 1
        ChartKPI.ChartAreas("ChartArea1").AxisX.LabelStyle.Interval = 1
        ChartKPI.ChartAreas("ChartArea1").AxisY.Title = "RRC Attempts"
        ChartKPI.ChartAreas("ChartArea1").AxisY2.Title = "R99 Traffic (Erlang)"

        ChartKPI.DataBind()
3
Matt

解決:

chart1.ChartAreas[1].AlignWithChartArea = chart1.ChartAreas[0].Name;
chart1.ChartAreas[1].AlignmentOrientation = AreaAlignmentOrientations.All;
2
user713994