2016-08-30 4 views
1

я некоторые значения диаграммы рассеяния, которые служат в качестве основного ряда данных, говорят:Возможно ли построить горизонтальную линию и вертикальную линию на диаграмме Excel?

цинка (частей на миллион), X значения: 20, 50, 60, 70, ...

железа (частей на миллион) , Y Значения: 30, 51, 10, 90, ...

Цинк и железо оба имеют верхние пороговые пределы, как высоко они могут быть, скажем, 50 ppm для железа и 100 ppm для цинка. Я бы хотел, чтобы они отображались визуально с горизонтальной линией для железа и вертикальной линией для цинка.

Отображение горизонтальной линии или вертикальной линии на вторичной оси X или вторичной оси Y соответственно достаточно просто (см. Блог Пельтье, тысячи потоков на переполнение стека и т. Д.). Но отображение обоих в то же время кажется невозможным. Например, для отображения вертикальной линии вы определяете новую серию данных как тип диаграммы «Scatter with Straight Lines», устанавливаете два значения X на 100 и устанавливаете два значения Y как 0 и 1. Voila!

Проблема с отображением как вертикальная, так и горизонтальная линия, похоже, что вы не можете разделить значения X и значения Y одной серии данных между первичной и вторичной осью. Значения X и Y одной серии данных должны быть либо на первичной оси, либо на вторичной оси. Это становится проблематичным при введении горизонтальной линии в мой пример, потому что это потребует от меня регулировки вторичной оси X, которая повлияет на то, как 100 отображается в серии данных вертикальной линии.

Я в настоящее время контролирую свой график через VBA, но решение по VBA или Excel было бы оценено!

Спасибо.

ответ

0

Есть отличный ответ here от @TimWilliams относительно как рисовать линию на графике. Ваш вопрос может быть переформулирован, я думаю, как Как нарисовать строк на графике?

Я установил ваш пример ниже и просто выбрал диапазон A2:I3 и вставил график XY, не прошивая ярлыками и т. Д. Примечание. Я также включил вычисление, чтобы получить максимум двух строк для графика XY , Это потому, что я предполагаю, что вы хотите, чтобы пороговая линия соответствовала максимальным значениям осей графика.

enter image description here

Таким образом, код является продолжением примера Тима, где мы вводим две новые серии на графике вместо одного. Во второй строке вы переключаете использование свойств XValues и Values, чтобы получить либо линию x, либо y-порог.

  • Для X порога он находится в точке 50 (intThresholdX) на оси х и простирается от 0-98 на оси у.

  • Для порога Y он простирается от 0 до 70 по оси x и находится в точке 80 (intThresholdY) по оси y.

Картина говорит тысячи слов для результата:

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 
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

Смежные вопросы