vb.net Zedgraph X 轴缩放值
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/15010319/
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
Zedgraph X-axis scaling values
提问by cMinor
I would like to increase the values shown in X-axis of a graph I am working on, in such a way:
我想以这种方式增加我正在处理的图形的 X 轴中显示的值:
X-axis starts in 0.125, then it shows 0.250, 0.5, 1.0, and then the numbers are 1.5, 2, 3,4,5,6,8,12as in following image (of course the graph is incorrect, but I wanted to show the scaling of X-axis values)
X 轴从 开始0.125,然后显示0.250, 0.5, 1.0,然后数字1.5, 2, 3,4,5,6,8,12如下图(当然图表不正确,但我想显示 X 轴值的缩放比例)


Currently I have this:
目前我有这个:


to do this I have (vb.net version)
要做到这一点,我有(vb.net 版本)
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms
Imports ZedGraph
Namespace Grid
Partial Public Class graficaControl
Inherits Form
Public Sub New()
InitializeComponent()
DrawGraph()
End Sub
Private Function h(ByVal x As Double) As Double
If x = 0 Then
Return 1
End If
Return Math.Sin(x) / x
End Function
Private Function f(ByVal x As Double) As Double
If x = 0 Then
Return 1
End If
Return Math.Sin(x)
End Function
Private Function g(ByVal x As Double) As Double
If x = 1 Then
Return 0
End If
Return Math.Cos(x)
End Function
Private Sub DrawGraph()
Dim masterPane As ZedGraph.MasterPane = zedGraph.MasterPane
Dim pane As New GraphPane()
masterPane.PaneList.Clear()
pane.XAxis.Title.Text = "X"
pane.XAxis.Title.FontSpec.IsUnderline = False
pane.XAxis.Title.FontSpec.IsBold = True
pane.XAxis.Title.FontSpec.FontColor = Color.Blue
pane.YAxis.Title.Text = "Y"
pane.Title.Text = "Right - FF1"
pane.Title.FontSpec.Fill.IsVisible = True
pane.Title.FontSpec.IsBold = False
'X AXIS UP
pane.X2Axis.IsVisible = True
pane.XAxis.IsVisible = False
pane.YAxis.Scale.IsReverse = True
'Grid
pane.XAxis.MajorGrid.IsVisible = True
pane.XAxis.MajorGrid.DashOn = 10
pane.XAxis.MajorGrid.DashOff = 5
pane.YAxis.MajorGrid.IsVisible = True
pane.YAxis.MajorGrid.DashOn = 10
pane.YAxis.MajorGrid.DashOff = 5
pane.YAxis.MinorGrid.IsVisible = True
pane.YAxis.MinorGrid.DashOn = 1
pane.YAxis.MinorGrid.DashOff = 2
pane.XAxis.MinorGrid.IsVisible = True
pane.XAxis.MinorGrid.DashOn = 1
pane.XAxis.MinorGrid.DashOff = 2
'FOR TEXT
pane.Legend.Position = LegendPos.Float
pane.Legend.Location.CoordinateFrame = CoordType.ChartFraction
pane.Legend.Location.AlignH = AlignH.Right
pane.Legend.Location.AlignV = AlignV.Bottom
pane.Legend.Location.TopLeft = New PointF(1.0F - 0.02F, 1.0F - 0.02F)
iGraph(pane)
' Add to master
masterPane.Add(pane)
'later add second graph
Using g As Graphics = CreateGraphics()
masterPane.SetLayout(g, PaneLayout.SquareColPreferred)
End Using
zedGraph.AxisChange()
zedGraph.Invalidate()
End Sub
Private Sub iGraph(ByVal izq As GraphPane)
izq.CurveList.Clear()
Dim list As New PointPairList()
Dim xmin As Double = -50
Dim xmax As Double = 3
Dim x As Double = xmin
While x <= xmax
list.Add(x, h(x))
x += 0.01
End While
Dim myCurve As LineItem = izq.AddCurve("sen(x)/x", list, Color.ForestGreen, SymbolType.None)
End Sub
Private WithEvents zedGraph As ZedGraph.ZedGraphControl
Private Sub InitializeComponent()
Me.zedGraph = New ZedGraph.ZedGraphControl()
Me.SuspendLayout()
'
'zedGraph
'
Me.zedGraph.Dock = System.Windows.Forms.DockStyle.Fill
Me.zedGraph.Location = New System.Drawing.Point(0, 0)
Me.zedGraph.Name = "Name"
Me.zedGraph.ScrollGrace = 0.0R
Me.zedGraph.ScrollMaxX = 0.0R
Me.zedGraph.ScrollMaxY = 0.0R
Me.zedGraph.ScrollMaxY2 = 0.0R
Me.zedGraph.ScrollMinX = 0.0R
Me.zedGraph.ScrollMinY = 0.0R
Me.zedGraph.ScrollMinY2 = 0.0R
Me.zedGraph.Size = New System.Drawing.Size(732, 461)
Me.zedGraph.TabIndex = 1
'
'component
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(732, 461)
Me.Controls.Add(Me.zedGraph)
Me.Name = "graph"
Me.Text = "test"
Me.ResumeLayout(False)
End Sub
End Class
End Namespace
also c# version
还有c#版本
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ZedGraph;
namespace Grid
{
public partial class graficaControl : Form
{
public graficaControl()
{
InitializeComponent();
DrawGraph();
}
private double h(double x)
{
if (x == 0) {
return 1;
}
return Math.Sin(x) / x;
}
private double f(double x)
{
if (x == 0) {
return 1;
}
return Math.Sin(x);
}
private double g(double x)
{
if (x == 1) {
return 0;
}
return Math.Cos(x);
}
private void DrawGraph()
{
ZedGraph.MasterPane masterPane = zedGraph.MasterPane;
GraphPane pane = new GraphPane();
masterPane.PaneList.Clear();
pane.XAxis.Title.Text = "X";
pane.XAxis.Title.FontSpec.IsUnderline = false;
pane.XAxis.Title.FontSpec.IsBold = true;
pane.XAxis.Title.FontSpec.FontColor = Color.Blue;
pane.YAxis.Title.Text = "Y";
pane.Title.Text = "Right - FF1";
pane.Title.FontSpec.Fill.IsVisible = true;
pane.Title.FontSpec.IsBold = false;
//X AXIS UP
pane.X2Axis.IsVisible = true;
pane.XAxis.IsVisible = false;
pane.YAxis.Scale.IsReverse = true;
//Grid
pane.XAxis.MajorGrid.IsVisible = true;
pane.XAxis.MajorGrid.DashOn = 10;
pane.XAxis.MajorGrid.DashOff = 5;
pane.YAxis.MajorGrid.IsVisible = true;
pane.YAxis.MajorGrid.DashOn = 10;
pane.YAxis.MajorGrid.DashOff = 5;
pane.YAxis.MinorGrid.IsVisible = true;
pane.YAxis.MinorGrid.DashOn = 1;
pane.YAxis.MinorGrid.DashOff = 2;
pane.XAxis.MinorGrid.IsVisible = true;
pane.XAxis.MinorGrid.DashOn = 1;
pane.XAxis.MinorGrid.DashOff = 2;
//FOR TEXT
pane.Legend.Position = LegendPos.Float;
pane.Legend.Location.CoordinateFrame = CoordType.ChartFraction;
pane.Legend.Location.AlignH = AlignH.Right;
pane.Legend.Location.AlignV = AlignV.Bottom;
pane.Legend.Location.TopLeft = new PointF(1f - 0.02f, 1f - 0.02f);
iGraph(pane);
// Add to master
masterPane.Add(pane);
//later add second graph
using (Graphics g = CreateGraphics()) {
masterPane.SetLayout(g, PaneLayout.SquareColPreferred);
}
zedGraph.AxisChange();
zedGraph.Invalidate();
}
private void iGraph(GraphPane izq)
{
izq.CurveList.Clear();
PointPairList list = new PointPairList();
double xmin = -50;
double xmax = 3;
double x = xmin;
while (x <= xmax) {
list.Add(x, h(x));
x += 0.01;
}
LineItem myCurve = izq.AddCurve("sen(x)/x", list, Color.ForestGreen, SymbolType.None);
}
private ZedGraph.ZedGraphControl zedGraph;
private void InitializeComponent()
{
this.zedGraph = new ZedGraph.ZedGraphControl();
this.SuspendLayout();
//
//zedGraph
//
this.zedGraph.Dock = System.Windows.Forms.DockStyle.Fill;
this.zedGraph.Location = new System.Drawing.Point(0, 0);
this.zedGraph.Name = "Name";
this.zedGraph.ScrollGrace = 0.0;
this.zedGraph.ScrollMaxX = 0.0;
this.zedGraph.ScrollMaxY = 0.0;
this.zedGraph.ScrollMaxY2 = 0.0;
this.zedGraph.ScrollMinX = 0.0;
this.zedGraph.ScrollMinY = 0.0;
this.zedGraph.ScrollMinY2 = 0.0;
this.zedGraph.Size = new System.Drawing.Size(732, 461);
this.zedGraph.TabIndex = 1;
//
//component
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6f, 13f);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(732, 461);
this.Controls.Add(this.zedGraph);
this.Name = "graph";
this.Text = "test";
this.ResumeLayout(false);
}
}
}
Update
更新
I have done the following and it is almost solved
我已经做了以下,它几乎解决了
'disable old axis scale
pane.X2Axis.Scale.IsVisible = False
pane.X2Axis.MajorTic.IsAllTics = False
' new labels
Dim x_vals = {0.125, 0.25, 0.5, 0.75, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 8.0, 12.0, 16.0}
' create custom labels and custom grid-lines using LineObj
For Each val As Double In x_vals
'add line
Dim line As New LineObj(pane.YAxis.Scale.Min, val, pane.YAxis.Scale.Max, val)
line.Line.Style = System.Drawing.Drawing2D.DashStyle.Dash
line.Line.Width = 1.0F
pane.GraphObjList.Add(line)
'add label
Dim text As New TextObj(val.ToString(), pane.YAxis.Scale.Min, val)
text.Location.AlignH = AlignH.Right
text.FontSpec.Border.IsVisible = False
text.FontSpec.Fill.IsVisible = False
pane.GraphObjList.Add(text)
Next
getting:
得到:


采纳答案by tmwoods
The scale you want is non-linear and so you need to change it to something like a logarithmic scale. Try screwing around with the AxisType Enumeration. At first glance I would guess you'll need a scaled logarithmic axis, or if that doesn't work just use an ordinal axis. It won't 'squeeze' the data points in but at least they will be labeled properly. If all else fails try using the string-array method (basically you fill out an array with the data points you want labeled). Good luck!
您想要的标度是非线性的,因此您需要将其更改为对数标度之类的东西。尝试使用AxisType Enumeration。乍一看,我猜你需要一个缩放的对数轴,或者如果这不起作用就使用序数轴。它不会“挤压”数据点,但至少它们会被正确标记。如果所有其他方法都失败,请尝试使用字符串数组方法(基本上,您可以使用要标记的数据点填充数组)。祝你好运!
EX:
前任:
pane.XAxis.Type = AxisType.Log;
Note that this will be a straight up base 10 logarithmic axis type, so it won't be the exact same numbers that you wanted.
请注意,这将是一个以 10 为底的对数轴类型,因此它不会是您想要的完全相同的数字。

