是否可以在Excel图表上绘制水平线和垂直线?

时间:2016-08-30 13:42:28

标签: excel vba excel-vba graph

我有一些散点图值作为我的主要数据系列,例如:

  

锌(ppm),X值:20,50,60,70,......

     

铁(ppm),Y值:30,51,10,90,......

锌和铁都有很高的阈值限制,例如铁含量为50 ppm,锌含量为100 ppm。我想用肉眼的水平线和锌的垂直线在视觉上显示这些。

分别在辅助X轴或辅助Y轴上显示水平线或垂直线很容易(参见Peltier的博客,Stack Overflow上的数千个线程等)。但是,同时显示两者似乎是不可能的。例如,要显示一条垂直线,您需要将一个新的数据系列指定为一个" Scatter with Straight Lines"图表类型,将两个X值设置为100,并将两个Y值设置为0和1.瞧!

显示垂直线和水平线的根本问题似乎是您无法在主轴和辅助轴之间拆分单个数据系列的X值和Y值。单个数据系列的X和Y值必须在主轴上或在辅助轴上都是。在我的示例中引入水平线时会出现问题,因为这需要我调整辅助X轴,这会影响100在垂直线数据系列中的显示方式。

我目前正在通过VBA控制我的图表,但是VBA或Excel本身的解决方案将不胜感激!

感谢。

2 个答案:

答案 0 :(得分:1)

@TimWilliams有一个很好的答案here关于如何在图表上画一条线。我想,你的问题可以重新措辞,因为如何在图表上绘制两条

我按照下面设置你的例子,只是简单地选择了范围A2:I3并插入了一个XY图,而没有摆弄标签等。注意我还包括一个计算来获得两行的最大值XY图。这是因为我想你想让阈值线相对于图的轴的最大值。

enter image description here

所以,代码是Tim的例子的扩展,我们在图中引入了两个新系列,而不是一个。对于第二行,您可以切换XValuesValues属性的使用,以获得x或y阈值线。

  • 对于X阈值,它位于x轴上的点50(intThresholdX),并且在y轴上从0-98延伸。

  • 对于Y阈值,它在x轴上从0-70延伸,在y轴上位于点80(intThresholdY)。

一张照片说的结果是千言万语:

enter image description here

代码:

Option Explicit

Sub DrawTwoThresholds()

    Dim ws As Worksheet
    Dim cht As ChartObject
    Dim srs As Series
    Dim intThresholdX As Integer
    Dim intThresholdY As Integer
    Dim intMaxX As Integer
    Dim intMaxY As Integer

    Set ws = ThisWorkbook.Worksheets("data") 'switch to your worksheet
    Set cht = ws.ChartObjects(1) 'assumes one chart is on the sheet
    intThresholdX = 50
    intThresholdY = 80
    intMaxX = ws.Range("K2").Value
    intMaxY = ws.Range("K3").Value

    'create x threshold line
    Set srs = cht.Chart.SeriesCollection.NewSeries()
    srs.Name = ""
    srs.XValues = Array(intThresholdX, intThresholdX)
    srs.Values = Array(intMaxY, 0)
    srs.MarkerStyle = xlMarkerStyleNone
    srs.Border.Color = vbRed

    'create y threshold line
    Set srs = cht.Chart.SeriesCollection.NewSeries()
    srs.Name = ""
    srs.XValues = Array(0, intMaxX)
    srs.Values = Array(intThresholdY, intThresholdY)
    srs.MarkerStyle = xlMarkerStyleNone
    srs.Border.Color = vbRed

End Sub

答案 1 :(得分:0)

谢谢你的帮助罗宾!我对你的代码的主要问题是用户仍然需要手动收缩轴,使线看起来像无限延伸。

我最终将所有数据系列设置在相同的轴上,并将X和Y阈值定义为非常高的数字(例如500000)。然后我通过将我的数据集的最大数量乘以1.1或用户定义的限制乘以1.1来设置轴限制,无论哪个更大。

你的解决方案可能更优雅,需要更少的资源,但在图表格式方面我是一个整洁的怪物:D

Horz(1) = 0
Horz(2) = 500000
Vert(1) = 0
Vert(2) = 500000

'First Example Data Series
With ActiveChart.SeriesCollection.NewSeries
    .Name = ActiveSheet.Cells(1, 2) & " Max Old"
    .ChartType = xlXYScatterLines
    .AxisGroup = xlPrimary
    .XValues = "='Graph'!$AE$3:$AE$4"
    .Values = Vert
    .Select
    .Format.Line.Weight = 2.25
    .Format.Line.Visible = True
    .Format.Line.ForeColor.RGB = RGB(195, 214, 155)     'Light Green
    .Format.Line.DashStyle = msoLineDash
    .MarkerStyle = -4142
End With

'Second Example Data Series
With ActiveChart.SeriesCollection.NewSeries
    .Name = ActiveSheet.Cells(2, 2) & " Max Old"
    .ChartType = xlXYScatterLines
    .AxisGroup = xlPrimary
    .XValues = Horz
    .Values = "='Graph'!$AE$5:$AE$6"
    .Select
    .Format.Line.Weight = 2.25
    .Format.Line.Visible = True
    .Format.Line.ForeColor.RGB = RGB(217, 150, 148)     'Light Red
    .Format.Line.DashStyle = msoLineDash
    .MarkerStyle = -4142
End With

With ActiveChart
    'Set the X axis limit
    .Axes(xlCategory, xlPrimary).MinimumScale = 0
    .Axes(xlCategory, xlPrimary).MaximumScale = WorksheetFunction.RoundUp(Application.Max(ActiveChart.SeriesCollection(1).XValues) * 1.1, 0)
    'Set the Y axis limit
    .Axes(xlValue, xlPrimary).MinimumScale = 0
    If Application.Max(ActiveChart.SeriesCollection(1).Values) >= Application.Max(ActiveChart.SeriesCollection(5).Values) Then
        .Axes(xlValue, xlPrimary).MaximumScale = WorksheetFunction.RoundUp(Application.Max(ActiveChart.SeriesCollection(1).Values) * 1.1, 0)
    Else
        .Axes(xlValue, xlPrimary).MaximumScale = WorksheetFunction.RoundUp(Application.Max(ActiveChart.SeriesCollection(5).Values) * 1.1, 0)
    End If
End With

Graph