Ответ 1
Если вы действительно хотите это сделать, вы можете изменить поперечные оси вертикальной оси на значение, с которого вы хотите начать. В этом случае мы начнем с 18.
Мы хотим избавиться от уродливой оси слева, чтобы затем создать копию диаграммы и удалить все и удалить все цвета заливки, за исключением оси, такой как приведенная ниже диаграмма. Затем вы создаете белый ящик без границ и закрываете исходную ось Y диаграммы. Обратите внимание, что я забыл установить цвет линии на "Нет" и отметки для верхней диаграммы.
Затем вы накладываете прозрачный график и получаете то, что хотите. Чтобы использовать VBA для автоматического обновления диаграммы, вы можете использовать ActiveChart.Axes(xlCategory).CrossesAt = 20
и произвести все изменения масштаба как для диаграммы наложения, так и для базовой диаграммы.
Вы можете использовать другую графическую программу или просто использовать первый график, который вы опубликовали, потому что, вероятно, не стоит тратить время на это для сложных диаграмм.
Код для этого автоматически:
Sub CreateDemoPlot()
Dim chart2 As ChartObject
Dim shape1 As shape
Range("A1:A6") = Application.Transpose(Split("20,40,100,1000,4500,10000", ","))
Range("B1:B6") = Application.Transpose(Split("-30,-50,-90,-70,-75,-88", ","))
Range("D3:K15").Name = "ChartArea" 'Set Chart Area
With ActiveSheet.ChartObjects.Add(Left:=100, Width:=400, Top:=100, Height:=200)
.Chart.SeriesCollection.NewSeries
.Chart.ChartType = xlXYScatterLinesNoMarkers
.Chart.Axes(xlValue).ScaleType = xlLinear
.Chart.Axes(xlValue).CrossesAt = -1000
.Chart.Axes(xlCategory).ScaleType = xlScaleLogarithmic
.Chart.Axes(xlCategory).HasMajorGridlines = True
.Chart.Axes(xlCategory).HasMinorGridlines = True
.Chart.Axes(xlCategory).MinimumScale = 0.9 * Cells(1, 1)
.Chart.Axes(xlCategory).MaximumScale = 1.1 * Cells(6, 1)
.Chart.Axes(xlCategory).MajorUnit = 10
.Chart.HasLegend = False
.Chart.SeriesCollection.NewSeries
.Chart.SeriesCollection(1).XValues = Range("A1:A6")
.Chart.SeriesCollection(1).Values = Range("B1:B6")
.Chart.Axes(xlCategory).CrossesAt = 18 'Or where ever the actual data starts
.Chart.Axes(xlCategory).MinimumScale = 10 'Set to 10 instead of the above code
'position to chart area
.Top = Range("ChartArea").Top
.Left = Range("ChartArea").Left
.Copy
'create white box
ActiveSheet.Shapes.AddShape msoShapeRectangle, 50, 50, 45, 200
Set shape1 = ActiveSheet.Shapes(2)
shape1.Fill.ForeColor.RGB = RGB(255, 255, 255)
shape1.Line.ForeColor.RGB = RGB(255, 255, 255)
'Position whitebox
shape1.Left = Range("ChartArea").Left
shape1.Top = Range("ChartArea").Top
'Paste overlay chart
ActiveSheet.Paste
Set chart2 = ActiveSheet.ChartObjects("Chart 3")
'Position overlay Chart
chart2.Top = Range("ChartArea").Top
chart2.Left = Range("ChartArea").Left
'Clear out overlay chart
chart2.Chart.Axes(xlValue).Format.Line.Visible = msoFalse
chart2.Chart.SeriesCollection(1).Format.Line.Visible = msoFalse
chart2.Chart.PlotArea.Format.Fill.Visible = msoFalse
chart2.Chart.Axes(xlCategory).Delete
chart2.Chart.SetElement (msoElementPrimaryValueGridLinesNone)
chart2.Chart.SetElement (msoElementPrimaryCategoryGridLinesNone)
chart2.Chart.ChartArea.Format.Fill.Visible = msoFalse
'Adjust Y axis position from overlay chart
chart2.Chart.PlotArea.Left = 10
chart2.Chart.PlotArea.Top = 0
End With
End Sub