当前位置: 首页 > 知识库问答 >
问题:

matplotlib绘图上主刻度和次刻度显示不正确

秦鹏飞
2023-03-14

我有福勒。数据帧:

Version       A2011       v1.0h
Decade                            
1510 - 1500  -3.553251   -0.346051
1520 - 1510  -2.797978   -0.356409
1530 - 1520  -2.194027   -0.358922
1540 - 1530  -1.709211   -0.329759
1550 - 1540  -1.354583   -0.308463
1560 - 1550  -1.062436   -0.305522
1570 - 1560  -0.821615   -0.293803
1580 - 1570  -0.620067   -0.279270
1590 - 1580  -0.465902   -0.271717
1600 - 1590  -0.341307   -0.289985
1610 - 1600  -0.365580   -0.491428
1620 - 1610  -0.329492   -0.532413
1630 - 1620  -0.299107   -0.568895
1640 - 1630  -0.283209   -0.591281
1650 - 1640  -0.267895   -0.595867
1660 - 1650  -0.250805   -0.593352
1670 - 1660  -0.240772   -0.539465
1680 - 1670  -0.234985   -0.514080
1690 - 1680  -0.230892   -0.497424
1700 - 1690  -0.229585   -0.484620
1710 - 1700  -0.853362   -0.892739
1720 - 1710  -0.738257   -1.017681
1730 - 1720  -0.660543   -0.966818
1740 - 1730  -1.331018   -1.171711
1750 - 1740  -1.271687   -1.541482
1760 - 1750  -1.023931   -1.559551
1770 - 1760  -1.089076   -1.757628
1780 - 1770  -1.965483   -2.404880
1790 - 1780  -1.579474   -2.167510
1800 - 1790  -1.740528   -2.023357
1810 - 1800  -2.237945   -2.804366
1820 - 1810  -2.744933   -2.379714
1830 - 1820  -3.706726   -3.717356
1840 - 1830  -4.680707   -4.048362
1850 - 1840  -5.836515   -4.660951
1860 - 1850  -7.141815   -4.919932
1870 - 1860  -5.847633   -2.972652
1880 - 1870  -9.280493   -6.146244
1890 - 1880  -8.815674   -6.689340
1900 - 1890  -9.548756   -8.893766
1910 - 1900 -10.596151  -10.115838
1920 - 1910 -12.002151  -10.492217
1930 - 1920 -12.524735  -11.155891
1940 - 1930 -13.945205  -14.295251
1950 - 1940 -13.877164  -13.609756
1960 - 1950 -20.660728  -17.546248
1970 - 1960 -14.495609  -15.537517
1980 - 1970 -14.865093  -13.292412
1990 - 1980 -16.254918  -13.626304
2000 - 1990 -12.212572   -8.392916

我是这样画的:

        import matplotlib.pyplot as plt
        from matplotlib.ticker import MaxNLocator

        ax = df.plot()

        # major ticks every 5, minor ticks every 1
        ax.xaxis.set_major_locator(MaxNLocator(11))

        ax.grid(which='minor', alpha=0.2)
        ax.grid(which='major', alpha=0.5)

        ax.legend().set_visible(False)
        plt.xticks(rotation=75)
        plt.tight_layout()
        plt.show()

结果图如下所示:

如何修复主要和次要刻度的数量,以便在主要刻度之间至少有10个主要刻度和用户指定的次要刻度的数量?

共有1个答案

常英资
2023-03-14

环顾四周,熊猫似乎不太擅长定位。似乎首选的设置标签的方法是自动的。问题似乎是,自动设置刻度标签时使用的数据与索引的隐式耦合与要设置的不同数量的刻度标签混淆在一起。

感觉应该有一个更好的方法(我对熊猫没有太多经验),但同时你可以使用一个主要的格式化程序来滚动你自己的标签。无论如何,我的经验是df。plot()很方便,但是如果您想确定,应该直接使用matplotlib。

关键技巧是使用半文档化的IndexFormatter设置x轴的主格式化程序,其标签来自数据帧的索引

import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator,IndexFormatter

ax = df.plot()

ax.xaxis.set_major_locator(MaxNLocator(11))
ax.xaxis.set_major_formatter(IndexFormatter(df.index)) # <-- new here

ax.grid(which='minor', alpha=0.2)
ax.grid(which='major', alpha=0.5)

ax.legend().set_visible(False)
plt.xticks(rotation=75)
plt.tight_layout()
plt.show()

缺少小刻度的原因是:

>>> ax.xaxis.get_minor_locator()
<matplotlib.ticker.NullLocator at 0x7faf53d0e1d0>

次要记号的默认定位器是NullLocator,它实际上禁用次要记号,从而导致明显缺少次要网格线。您应该为次要刻度选择并设置一个合适的定位器,然后一切都应该正常(换句话说,我不确定是否有一种简单的方法可以根据主要刻度指定次要栅格的数量)。

 类似资料:
  • 问题内容: 我可以用 但这也会删除标签。我可以以任何方式绘制刻度标签,但不能绘制刻度和书脊 问题答案: 您可以使用(http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.tick_params)将刻度长度设置为0 :

  • 刻度指的是轴上数据点的标记,Matplotlib 能够自动的在 x 、y 轴上绘制出刻度。这一功能的实现得益于 Matplotlib 内置的刻度定位器和格式化器(两个内建类)。在大多数情况下,这两个内建类完全能够满足我们的绘图需求,但是在某些情况下,刻度标签或刻度也需要满足特定的要求,比如将刻度设置为“英文数字形式”或者“大写阿拉伯数字”,此时就需要对它们重新设置。 xticks() 和 ytic

  • 问题内容: 我要针对日期绘制具有五个数字(210.10、210.25、211.35等)的数字,我希望y轴刻度线显示所有数字(“ 214.20”而不是“ 0.20 + 2.14e2”),但没有能够弄清楚这一点。我试图将ticklabel格式设置为纯格式,但似乎没有效果。 关于我明显失踪的任何提示吗? 问题答案: 您也可以只关闭偏移量:(几乎完全相同的副本,如何删除matplotlib轴上的相对偏移)

  • 问题内容: 我遇到了与此处报告的问题类似的问题。我不明白为什么刻度标签文本为空字符串: 输出: 我得到的结果相同,但是绘制的图在保存或显示时在x轴上显示了八个带标记的刻度。但是,如果我 在 显示图 后 要求标签,则该列表已正确填充。当然,现在要做任何更改都为时已晚。 输出: 为什么会发生这种情况(Mac OS X Yosemite,Matplotlib 1.5.1),以及 在 显示或保存绘图 之前

  • 问题内容: 如何在线性与线性图上仅在y轴上旋转次刻度? 当我使用该功能打开次刻度时,它们同时出现在x和y轴上。 问题答案: 没关系,我知道了。

  • 问题内容: 对于y轴上的每个刻度标签,我想更改: 我正在绘制对数日志数据(以2为底),但是我希望标签显示原始数据值。 我知道我可以得到当前的y标签 这给了我一个列表: 每个列表都是 我在http://matplotlib.org/users/text_props.html上查看了文本对象的文档, 但是我仍然不确定更改每个文本标签中的字符串的正确语法是什么。 更改标签后,可以使用以下方法在轴上设置它