【问题标题】:Is it possible to plot both a horizontal line and a vertical line on an Excel chart?是否可以在 Excel 图表上同时绘制水平线和垂直线?
【发布时间】:2017-01-06 20:08:02
【问题描述】:

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

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

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

锌和铁都有上限阈值限制,例如铁为 50 ppm,锌为 100 ppm。我希望用铁的水平线和锌的垂直线直观地显示这些。

分别在辅助 X 轴或辅助 Y 轴上显示水平线或垂直线非常简单(请参阅 Peltier 的博客、Stack Overflow 上的数千个线程等)。但是,同时显示两者似乎是不可能的。例如,要显示一条垂直线,您可以将新数据系列指定为“直线散点图”图表类型,将两个 X 值设置为 100,并将两个 Y 值设置为 0 和 1。瞧!

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

我目前正在通过 VBA 控制我的图表,但如果能通过 VBA 或 Excel 适当的解决方案将不胜感激!

谢谢。

【问题讨论】:

    标签: vba excel graph


    【解决方案1】:

    @TimWilliams 提供了一个很好的答案here,关于如何在图表上画线。我猜您的问题可以重新表述为如何在图表上绘制两条线

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

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

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

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

    一张图说出一千个字的结果:

    代码:

    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
    

    【讨论】:

      【解决方案2】:

      感谢您的帮助罗宾!我对您的代码的主要问题是用户仍然必须手动收缩轴以使线条看起来像是向无穷大延伸。

      我最终将我的所有数据系列设置在相同的轴上,并将 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

      【讨论】:

        猜你喜欢
        • 2011-02-23
        • 1970-01-01
        • 1970-01-01
        • 2020-01-15
        • 2015-04-04
        • 1970-01-01
        • 2022-01-03
        • 2022-01-21
        • 1970-01-01
        相关资源
        最近更新 更多