在 Microsoft Excel 中将轴值表示为 10 的 1 次方、2 次方、3 次方等...

在 Microsoft Excel 中将轴值表示为 10 的 1 次方、2 次方、3 次方等...

我手上有以下图表:

图表

我想用 10 的整数次方符号替换当前的 X 轴和 Y 轴值。我不想要科学(指数)符号。提前致谢。

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

注意:可以从此处复制代码并粘贴到常规代码模块中。请参阅如何:使用其他人的宏如果你之前没有这样做过,可以去我的博客查看。

下面是两张图表:原始图表和带有漂亮指数标签的图表。

漂亮的指数轴标签

相关内容