I have a chart with some data with a linear y-axis and a logarithmic x-axis. The question is about the logarithmic (x-)axis.
I want the logarithmic ticks on the x-axis to align with exact decades (powers of 10), but I don't want the axis to necessarily start at the exact decades; I want it to start where my data starts. So for instance, the axis could start at 3; but the first major tick should be at 10. How do I do this?
Currently when I set the axis to start at 3, the major gridline is at 3, which is no good.
When I set the following properties, the grid and ticks are fine, but that's because I force the axis to start at a decade (which I don't want to do).
.Chart.Axes(xlCategory).ScaleType = xlScaleLogarithmic
.Chart.Axes(xlCategory).HasMajorGridlines = True
.Chart.Axes(xlCategory).HasMinorGridlines = True
.Chart.Axes(xlCategory).MinimumScale = 10 ^ (Int(Application.Log10(Cells(DATA_START, 6))))
.Chart.Axes(xlCategory).MaximumScale = 10 ^ (Int(Application.Log10(Cells(DATA_START + n, 6)) - 0.00001) + 1)
This is how it looks: nice grid, but axis not starting at the right place.
Now, when I don't specifically round the min and max of my axis to a decade,
' ...
.Chart.Axes(xlCategory).MinimumScale = 0.9 * Cells(DATA_START, 6)
.Chart.Axes(xlCategory).MaximumScale = 1.1 * Cells(DATA_START + n, 6)
it looks like this, with the axis starting at the right place, but the grid/ticks looking silly:
In this example, I would expect the first tick to be at 100 and only minor ticks/gridlines before that.
I have already figured out, that I can set the multiplicative factor between two major ticks with .MajorUnit = 10
.
I have a SSCCE for you: just run this macro on an empty sheet. It produces a chart that has the major ticks (and gridlines) at 18, 180, 1800
, but I want them at 100, 1000
.
Sub CreateDemoPlot()
Range("A1:A6") = Application.Transpose(Split("20,40,100,1000,4500,10000", ","))
Range("B1:B6") = Application.Transpose(Split("-30,-50,-90,-70,-75,-88", ","))
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")
End With
End Sub