如何使用Matplotlib在对数-对数图中显示所有刻度上的对数间隔网格线?

41

我正在尝试绘制一个对数-对数图,该图在底部和左侧的刻度线上显示以对数间隔排列的网格线。我已经能够使用matplotlib.pyplot.grid(True)显示了一些网格线,但这仅在10的幂级别上为我显示网格线。因此,以下是我目前所得到的示例:

Alt text

我希望能够得到一些类似于这样的网格线,其中网格线并不是均匀分布的:

Alt text

我该如何在Matplotlib中实现这个目标?

2个回答

62

基本上,你只需要在网格命令中加入参数which="both",使其变为:

matplotlib.pyplot.grid(True, which="both")

另外还有“minor”和“major”的选项,它们是主刻度线(在您的图表中显示)和您缺少的次刻度线。如果您想要实线,则也可以将ls="-"作为grid()的参数使用。

以下是一个示例:

import numpy as np
from matplotlib import pyplot as plt

x = np.arange(0, 100, .5)
y = 2 * x**3

plt.loglog(x, y)
plt.grid(True, which="both", ls="-")
plt.show()

生成的结果如下:

一个对数-对数图

有关详细信息,请参阅Matplotlib文档


2
我发现在我的机器上使用“both”选项既不显示主要网格线也不显示次要网格线。通过一些谷歌搜索,我找到了这篇文章:http://www.mailinglistarchive.com/html/matplotlib-users@lists.sourceforge.net/2010-06/msg00174.html。 该文章似乎表明较旧版本的matplotlib需要使用“majorminor”而不是“both”。您是否知道是否有任何官方文档记录了这个版本之间的更改?我查看了http://matplotlib.sourceforge.net/api/api_changes.html,但似乎没有提到它... - Bryce Thomas
看到其中一条消息让我觉得它发生在2010年6月9日。我不确定那将会是哪个版本,但它相当近期。 - Justin Peel
次要网格线会让图形看起来非常拥挤。或者,您可以尝试在matplotlibrc文件中增加主/次x/y刻度的大小。 - Gökhan Sever
1
@Gokan 我有一定的同意,不过我发现如果你使用点线而不是实线,网格就不会那么显眼。 - Bryce Thomas
@JustinPeel 我的数值范围从108到1017,但是在y轴上仍然缺少次要网格线。 - Alexander Cska
显示剩余3条评论

9

就像 @Bryce 说的那样,在旧版本的 matplotlib 中,正确的关键字参数是 which=majorminor。我认为使用浅色实线可能比虚线更好。

plt.grid(True, which="majorminor", ls="-", color='0.65')

请注意,在最新版本的matplotlib中,此参数已被“both”取代。
plt.grid(True, which="both", ls="-", color='0.65')

1
我需要将 zorder=3 设置到我的实际(直方图)绘图中,因为网格线会穿过我的条形图。 - moooeeeep
2
Matblotlib版本3.1.2的参数必须是which='both' - Gustavo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接