在VBA系列Excel中对Y轴的对称性

时间:2016-11-23 13:10:47

标签: vba excel-vba plot charts axes

我使用Chart对象和SeriesCollection.NewSeries绘制了一些绘图 代码的一部分就像这样

Private Function AddSeriesAndFormats(PPSChart As Chart, shInfo As Worksheet, tests() As PPS_Test, RowCount As Integer, col As Integer, smoothLine As Boolean, lineStyle As String, transparency As Integer, lineWidth As Single, ByRef position As Integer) As Series

Dim mySeries As Series

Set mySeries = PPSChart.SeriesCollection.NewSeries
With mySeries
    .Name = tests(0).GetString()
    .XValues = "='" & shInfo.Name & "'!R" & RowCount - UBound(tests) - 1 & "C" & CInt(4 * (col + 1) - 2) & ":R" & RowCount - 1 & "C" & CInt(4 * (col + 1) - 2)
    .Values = "='" & shInfo.Name & "'!R" & RowCount - UBound(tests) - 1 & "C" & CInt(4 * (col + 1) - 1) & ":R" & RowCount - 1 & "C" & CInt(4 * (col + 1) - 1)
    .Smooth = smoothLine
    .Format.line.Weight = lineWidth
    .Format.line.DashStyle = GetLineStyle(lineStyle)
    .Format.line.transparency = CSng(transparency / 100)
    .MarkerStyle = SetMarkerStyle(position)
    .MarkerSize = 9
    .MarkerForegroundColorIndex = xlColorIndexNone
End With

Set AddSeriesAndFormats = mySeries

End Function

并且像这样创建PPSChart

Private Function AddChartAndFormatting(chartName As String, chartTitle As String, integralBuffer As Integer, algoPropertyName As String) As Chart

Dim PPSChart As Chart, mySeries As Series

Set PPSChart = Charts.Add
With PPSChart
    .Name = chartName
    .HasTitle = True
    .chartTitle.Characters.Text = chartTitle
    .ChartType = xlXYScatterLines
    .Axes(xlCategory, xlPrimary).HasTitle = True
    .Axes(xlValue, xlPrimary).HasTitle = True
    If algoPropertyName <> "" Then 'case for Generic PPS plots
        .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = algoPropertyName
    Else
        .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "PL/PR max(avg_" & integralBuffer & "ms) [mbar]" 'case for the bumper obsolate algorithm
    End If
    .Axes(xlCategory, xlPrimary).AxisTitle.Text = "Bumper Position [mm]"
End With

' delete random series that might be generated
For Each mySeries In PPSChart.SeriesCollection
    mySeries.Delete
Next mySeries

Set AddChartAndFormatting = PPSChart

End Function

结果的一个例子如下图所示 enter image description here 我想要的是让X轴从-350开始,即使我没有Y轴左侧的值(在负侧)​​。实际上,我想要的是中间的Y轴,即使绘制的值是正的(最大X值和朝向Y轴的最小X值之间的对称性)。 你能告诉我是否有可能给我一些例子吗?

2 个答案:

答案 0 :(得分:1)

您好,你可以尝试这样的事情:

#2a((2 3) (2 3))

我的建议是,您应该将系列值分配给对象以便于使用

Dim dMinValue as Double, dMaxValue as Double

With PPSChart
    dMinValue = application.WorksheetFunction.Min("='" & _
                    shInfo.Name & "'!R" & RowCount - UBound(tests) - 1 _ 
                    & "C" & CInt(4 * (col + 1) - 2) & ":R" & RowCount - 1  _
                    & "C" & CInt(4 * (col + 1) - 2))

    dMaxValue = application.WorksheetFunction.Max("='" & _
                    shInfo.Name & "'!R" & RowCount - UBound(tests) - 1 _ 
                    & "C" & CInt(4 * (col + 1) - 2) & ":R" & RowCount - 1  _
                    & "C" & CInt(4 * (col + 1) - 2))
    ....
    .Axes(xlValue).MinimumScale = dMinValue
    .Axes(xlValue).MaximumScale = dMaxValue
    ....
End With

答案 1 :(得分:0)

Sub AddChartObject()
    Dim myChtObj As ChartObject

    Set myChtObj = ActiveSheet.ChartObjects.Add _
        (Left:=100, Width:=375, Top:=75, Height:=225)
    myChtObj.Chart.SetSourceData Source:=Sheets("Sheet1").Range("A3:G14")
    myChtObj.Chart.ChartType = xlXYScatterLines

    ' delete random series that might be generated
    For Each mySeries In myChtObj.Chart.SeriesCollection
        mySeries.Delete
    Next mySeries

    ' add series
    Set mySeries = myChtObj.Chart.SeriesCollection.NewSeries
    mySeries.XValues = Array(0, 300)
    mySeries.Values = Array(88, 65)

    ' rescale axis after adding series
    With myChtObj.Chart.Axes(xlCategory) ' otherwise can use ActiveSheet.ChartObjects(1).Chart.Axes(xlCategory)
        .MinimumScale = -350 'ActiveSheet.Range("C33").Value
        .MaximumScale = 350 'ActiveSheet.Range("D54").Value
    End With
End Sub

symmetrical horizontal axis