C# Winforms - 创建具有多个 Y 轴(3 个或更多)的图表
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/15805121/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
C# Winforms - Creating a chart with multiple Y axis (3 or more)
提问by user2243704
I have a client that needs to use charts with more than 2 Y axes.
我有一个客户需要使用超过 2 个 Y 轴的图表。
I am already using Component One (C1Chart) chart that has a built in Y2 axis and its working
我已经在使用具有内置 Y2 轴及其工作的组件一 (C1Chart) 图表
great.
伟大的。
Does anyone knows of a chart control that can display 3 or more Y axes on a chart ?
有谁知道可以在图表上显示 3 个或更多 Y 轴的图表控件?
回答by Farhan Ahmed
The MS Chart controlhas almost everything you will ever need as far as charting is concerned. Download the sample, run it and go to Chart Features > Axes > Multiple Y axis. I think you will find what you are looking for!
就图表而言,MS Chart 控件几乎拥有您所需要的一切。下载示例,运行它并转到图表特征 > 轴 > 多 Y 轴。我想你会找到你想要的!
回答by fat
Samples Environments for Microsoft Chart Controlscontains example of multiple Y axis.
Some pieces of code:
Microsoft Chart Controls 的示例环境包含多个 Y 轴的示例。
部分代码:
private void checkBoxUseMultipleYAxis_CheckedChanged(object sender, System.EventArgs e)
{
if(checkBoxUseMultipleYAxis.Checked)
{
// Set custom chart area position
Chart1.ChartAreas["Default"].Position = new ElementPosition(25,10,68,85);
Chart1.ChartAreas["Default"].InnerPlotPosition = new ElementPosition(10,0,90,90);
// Create extra Y axis for second and third series
CreateYAxis(Chart1, Chart1.ChartAreas["Default"], Chart1.Series["Series2"], 13, 8);
CreateYAxis(Chart1, Chart1.ChartAreas["Default"], Chart1.Series["Series3"], 22, 8);
}
else
{
// Set default chart areas
Chart1.Series["Series2"].ChartArea = "Default";
Chart1.Series["Series3"].ChartArea = "Default";
// Remove newly created series and chart areas
while(Chart1.Series.Count > 3)
{
Chart1.Series.RemoveAt(3);
}
while(Chart1.ChartAreas.Count > 1)
{
Chart1.ChartAreas.RemoveAt(1);
}
// Set default chart are position to Auto
Chart1.ChartAreas["Default"].Position.Auto = true;
Chart1.ChartAreas["Default"].InnerPlotPosition.Auto = true;
}
}
public void CreateYAxis(Chart chart, ChartArea area, Series series, float axisOffset, float labelsSize)
{
// Create new chart area for original series
ChartArea areaSeries = chart.ChartAreas.Add("ChartArea_" + series.Name);
areaSeries.BackColor = Color.Transparent;
areaSeries.BorderColor = Color.Transparent;
areaSeries.Position.FromRectangleF(area.Position.ToRectangleF());
areaSeries.InnerPlotPosition.FromRectangleF(area.InnerPlotPosition.ToRectangleF());
areaSeries.AxisX.MajorGrid.Enabled = false;
areaSeries.AxisX.MajorTickMark.Enabled = false;
areaSeries.AxisX.LabelStyle.Enabled = false;
areaSeries.AxisY.MajorGrid.Enabled = false;
areaSeries.AxisY.MajorTickMark.Enabled = false;
areaSeries.AxisY.LabelStyle.Enabled = false;
areaSeries.AxisY.IsStartedFromZero = area.AxisY.IsStartedFromZero;
series.ChartArea = areaSeries.Name;
// Create new chart area for axis
ChartArea areaAxis = chart.ChartAreas.Add("AxisY_" + series.ChartArea);
areaAxis.BackColor = Color.Transparent;
areaAxis.BorderColor = Color.Transparent;
areaAxis.Position.FromRectangleF(chart.ChartAreas[series.ChartArea].Position.ToRectangleF());
areaAxis.InnerPlotPosition.FromRectangleF(chart.ChartAreas[series.ChartArea].InnerPlotPosition.ToRectangleF());
// Create a copy of specified series
Series seriesCopy = chart.Series.Add(series.Name + "_Copy");
seriesCopy.ChartType = series.ChartType;
foreach(DataPoint point in series.Points)
{
seriesCopy.Points.AddXY(point.XValue, point.YValues[0]);
}
// Hide copied series
seriesCopy.IsVisibleInLegend = false;
seriesCopy.Color = Color.Transparent;
seriesCopy.BorderColor = Color.Transparent;
seriesCopy.ChartArea = areaAxis.Name;
// Disable drid lines & tickmarks
areaAxis.AxisX.LineWidth = 0;
areaAxis.AxisX.MajorGrid.Enabled = false;
areaAxis.AxisX.MajorTickMark.Enabled = false;
areaAxis.AxisX.LabelStyle.Enabled = false;
areaAxis.AxisY.MajorGrid.Enabled = false;
areaAxis.AxisY.IsStartedFromZero = area.AxisY.IsStartedFromZero;
areaAxis.AxisY.LabelStyle.Font = area.AxisY.LabelStyle.Font;
// Adjust area position
areaAxis.Position.X -= axisOffset;
areaAxis.InnerPlotPosition.X += labelsSize;
}
Result:
结果:
回答by Matt L
I think you could try multiple ChartArea's, which allows you to arrange multiple plots in the same chart object.
我认为您可以尝试多个 ChartArea,它允许您在同一个图表对象中排列多个图。