答案1
您需要做大量的手动格式化工作,因为 Excel 没有您想要的数字格式。
1 - 自定义数字格式
右键单击轴数字,选择“设置轴格式”,转到“数字”部分,然后输入以下自定义格式:
"10^"#
让你的轴使用这种自定义格式。
这会在任何显示的数字前面添加文本“10^”。
2 - 记录你的数据
1) 中的自定义格式假设您的数据已记录。因此我们需要记录您的数据,并将其绘制成图表。找到每个数据点的对数:
Data
X Y Log10(X) Log10(Y)
30 300 1.477121255 2.477121255
28 300 1.447158031 2.477121255
26 300 1.414973348 2.477121255
300 200 2.477121255 2.301029996
280 200 2.447158031 2.301029996
260 200 2.414973348 2.301029996
让你的图表绘制在右边两列上。
3 - 修复日志行
Excel 对数图假定主对数线应位于 1、10、100、1000 等处。但是您希望主线位于 1、2、3 处,因为您已经记录了数据。
所以我们需要制作自己的线条,并将它们格式化为细灰线。
首先,从绘图中删除网格线,因为我们要制作自己的网格线。
然后添加每 10、100、1000 等指定每行开始和结束的数据点对,然后记录数据。在每对点之间留出空格以分隔线条,也便于查看正在发生的事情。您应该得到如下表格:
Lines
X Y Log(X) Log(Y)
10 10 1.0 1.0
10 100000 1.0 5.0
20 10 1.3 1.0
20 100000 1.3 5.0
30 10 1.5 1.0
30 100000 1.5 5.0
40 10 1.6 1.0
40 100000 1.6 5.0
50 10 1.7 1.0
50 100000 1.7 5.0
60 10 1.8 1.0
60 100000 1.8 5.0
70 10 1.8 1.0
70 100000 1.8 5.0
80 10 1.9 1.0
80 100000 1.9 5.0
90 10 2.0 1.0
90 100000 2.0 5.0
100 10 2.0 1.0
100 100000 2.0 5.0
200 10 2.3 1.0
200 100000 2.3 5.0
300 10 2.5 1.0
300 100000 2.5 5.0
400 10 2.6 1.0
400 100000 2.6 5.0
500 10 2.7 1.0
500 100000 2.7 5.0
600 10 2.8 1.0
600 100000 2.8 5.0
700 10 2.8 1.0
700 100000 2.8 5.0
800 10 2.9 1.0
800 100000 2.9 5.0
900 10 3.0 1.0
900 100000 3.0 5.0
1000 10 3.0 1.0
1000 100000 3.0 5.0
10 100 1.0 2.0
10000 100 4.0 2.0
10 200 1.0 2.3
10000 200 4.0 2.3
10 300 1.0 2.5
10000 300 4.0 2.5
10 400 1.0 2.6
10000 400 4.0 2.6
10 500 1.0 2.7
10000 500 4.0 2.7
10 600 1.0 2.8
10000 600 4.0 2.8
10 700 1.0 2.8
10000 700 4.0 2.8
10 800 1.0 2.9
10000 800 4.0 2.9
10 900 1.0 3.0
10000 900 4.0 3.0
10 1000 1.0 3.0
10000 1000 4.0 3.0
10 2000 1.0 3.3
10000 2000 4.0 3.3
10 3000 1.0 3.5
10000 3000 4.0 3.5
10 4000 1.0 3.6
10000 4000 4.0 3.6
10 5000 1.0 3.7
10000 5000 4.0 3.7
10 6000 1.0 3.8
10000 6000 4.0 3.8
10 7000 1.0 3.8
10000 7000 4.0 3.8
10 8000 1.0 3.9
10000 8000 4.0 3.9
10 9000 1.0 4.0
10000 9000 4.0 4.0
10 10000 1.0 4.0
10000 10000 4.0 4.0
将 Log(x) 和 Log(y) 列作为数据系列添加到绘图中,然后格式化数据系列以显示不点,而是细灰线。
4 - 轴标签
- 我们已经记录了所有内容,因此将轴更改为不记录数据 - 您不需要记录两次。
- 将主单位更改为 1,以便每个日志周期获取标签。
- 删除主要和次要刻度标记,因为它们位于错误的位置。
添加任何数据标签、图例等,就完成了。
答案2
因此,方法是在每个轴上您想要轴标签的位置添加虚拟系列。隐藏这些点,添加数据标签,输入 101、102 等(代表 10^1、10^2 等),并将指数格式化为上标。手动执行此操作很麻烦,因为很难选择指数并应用格式,还有其他困难的事情。
所以我写了一个小程序。选择一个对数对数图,其左边缘和下边缘为轴,然后运行下面的代码。
Sub NiceExponentialAxisLabels()
Dim cht As Chart
Dim iPt As Long, iLog As Long, iMin As Long, iMax As Long
Dim vXVals As Variant, vYVals As Variant
Dim dFont As Double
Set cht = ActiveChart
' HORIZONTAL AXIS ------------------------------------
cht.Axes(xlCategory).TickLabels.NumberFormat = ";;;" ' hide tick labels
' build arrays of X and Y values
iMin = WorksheetFunction.Log10(cht.Axes(xlCategory).MinimumScale)
iMax = WorksheetFunction.Log10(cht.Axes(xlCategory).MaximumScale)
ReDim vXVals(1 To 1)
ReDim vYVals(1 To 1)
iPt = 0
For iLog = iMin To iMax
iPt = iPt + 1
ReDim Preserve vXVals(1 To iPt)
ReDim Preserve vYVals(1 To iPt)
vXVals(iPt) = 10 ^ iLog
vYVals(iPt) = cht.Axes(xlValue).MinimumScale
Next
' add series, hide points, add and format labels
With cht.SeriesCollection.NewSeries
.Name = "horizontal"
.XValues = vXVals
.Values = vYVals
.Format.Line.Visible = False
.MarkerStyle = xlMarkerStyleNone
.HasDataLabels = True
.DataLabels.Position = xlLabelPositionBelow
For iPt = 1 To .Points.Count
With .DataLabels(iPt)
dFont = .Font.Size
.Text = 10 & WorksheetFunction.Log10(vXVals(iPt))
With .Characters(3, Len(.Text) - 2)
.Font.Superscript = True
.Font.Size = dFont + 2
End With
With .Characters(1, 2)
.Font.Size = dFont
End With
End With
Next
End With
' VERTICAL AXIS ------------------------------------
cht.Axes(xlValue).TickLabels.NumberFormat = "_0_0_0_0_0_0_0" ' hide but maintain margin
' build arrays of X and Y values
iMin = WorksheetFunction.Log10(cht.Axes(xlValue).MinimumScale)
iMax = WorksheetFunction.Log10(cht.Axes(xlValue).MaximumScale)
ReDim vXVals(1 To 1)
ReDim vYVals(1 To 1)
iPt = 0
For iLog = iMin To iMax
iPt = iPt + 1
ReDim Preserve vXVals(1 To iPt)
ReDim Preserve vYVals(1 To iPt)
vXVals(iPt) = cht.Axes(xlCategory).MinimumScale
vYVals(iPt) = 10 ^ iLog
Next
' add series, hide points, add and format labels
With cht.SeriesCollection.NewSeries
.Name = "vertical"
.XValues = vXVals
.Values = vYVals
.Format.Line.Visible = False
.MarkerStyle = xlMarkerStyleNone
.HasDataLabels = True
.DataLabels.Position = xlLabelPositionLeft
For iPt = 1 To .Points.Count
With .DataLabels(iPt)
dFont = .Font.Size
.Text = 10 & WorksheetFunction.Log10(vYVals(iPt))
With .Characters(3, Len(.Text) - 2)
.Font.Superscript = True
.Font.Size = dFont + 2
End With
With .Characters(1, 2)
.Font.Size = dFont
End With
End With
Next
End With
End Sub
注意:可以从此处复制代码并粘贴到常规代码模块中。请参阅如何:使用其他人的宏如果你之前没有这样做过,可以去我的博客查看。
下面是两张图表:原始图表和带有漂亮指数标签的图表。