【问题标题】:How to prevent numbers being changed to exponential form in Python matplotlib figure如何防止在 Python matplotlib 图中将数字更改为指数形式
【发布时间】:2013-01-20 14:57:28
【问题描述】:

我在 Python 中使用 Matplotlib 来绘制简单的 x-y 数据集。这会产生漂亮的图形,尽管当我使用图形视图(当您执行 plt.show() 时出现)“放大”过近绘制图形的各个部分时,x 轴值会从标准数字形式(1050 , 1060, 1070 等)转换为具有指数符号的科学形式(例如 1、1.5、2.0,x 轴标签为+1.057e3)。

我希望我的数字保留轴的简单编号,而不是使用指数形式。有没有办法强制 Matplotlib 这样做?

【问题讨论】:

标签: python graph matplotlib figure


【解决方案1】:

刻度标签的格式由Formatter 对象控制,假设您没有做任何花哨的事情,它将是ScalerFormatterby default。如果可见值的小部分变化非常小,则此格式化程序将使用常量移位。为避免这种情况,只需将其关闭即可:

plt.plot(arange(0,100,10) + 1000, arange(0,100,10))
ax = plt.gca()
ax.get_xaxis().get_major_formatter().set_useOffset(False)
plt.draw()

如果你想避免一般的科学记数法,

ax.get_xaxis().get_major_formatter().set_scientific(False)

可以通过axes.formatter.useoffset rcparam 全局控制。

【讨论】:

  • 谢谢,这行得通。也为重复的问题道歉 - 我在发布之前进行了搜索,但我的搜索包括诸如“科学记数法”和“指数形式”之类的术语,而不是之前用户使用的“相对轴偏移”。
  • 有没有办法永久强制这种改变?我从来没有找到科学记数法轴,最后总是把它们关掉。不过,我看不到 rcParam。
  • @IanRoberts 查看更新它是axes.formatter.useoffset rcparam
  • 太好了,谢谢!我个人更喜欢默认将此设置为 False,因为它似乎使许多人感到困惑而使少数人受益。
  • 没错,好点。这是一个相当未经证实的说法,尽管我看到很多人问如何禁用它。无论如何,这个修复很好地解决了它,所以我现在可以忘记这个......干杯
【解决方案2】:

你可以使用类似的东西:

from matplotlib.ticker import ScalarFormatter, FormatStrFormatter

ax.xaxis.set_major_formatter(FormatStrFormatter('%.0f'))

【讨论】:

  • 这是在使用对数轴时唯一对我有用的解决方案。其他选项我尝试了所有引发的属性错误,例如AttributeError: 'LogFormatterSciNotation' object has no attribute 'set_scientific'
【解决方案3】:

您可以使用更简单的命令将其关闭:

plt.ticklabel_format(useOffset=False)

【讨论】:

  • 例如,您可能需要使用 axis='x' 指定轴,以防您得到关于 ScalarFormattersAttributeError
【解决方案4】:

使用以下命令: ax.ticklabel_format(useOffset=False, style='plain')

如果您使用的是子图,您可能会遇到AttributeError: This method only works with the ScalarFormatter,在这种情况下,您可以添加axis='y',如下所示。您可以将 'y' 更改为有问题的轴。

ax1.ticklabel_format(useOffset=False, style='plain', axis='y')

来源问答here。注意,axis 'y' 命令使用隐藏在答案 cmets 中。

【讨论】:

    【解决方案5】:

    我在图表之前使用了下面的代码,它对我来说是无缝的..

    plt.ticklabel_format(style='plain')
    

    【讨论】:

      【解决方案6】:

      确实,我不想在放大时显示科学数字,以下也适用于我的情况。我在科学形式没有意义的标签中使用纬度/经度。

      plt.ticklabel_format(useOffset=False)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-26
        • 1970-01-01
        • 2020-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多