如何在xkcd图中创建网格

4

我想创建一些带有网格背景的xkcd图。就像这个例子,但是当使用plt.xkcd()时,网格不会出现在图表中。

from matplotlib import pyplot as plt
import numpy as np

plt.xkcd()
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
plt.xticks([])
plt.yticks([])
ax.set_ylim([-30, 10])
plt.grid()

data = np.ones(100)
data[70:] -= np.arange(30)

plt.annotate(
    'THE DAY I REALIZED\nI COULD COOK BACON\nWHENEVER I WANTED',
    xy=(70, 1), arrowprops=dict(arrowstyle='->'), xytext=(15, -10))

plt.plot(data)

plt.xlabel('time')
plt.ylabel('my overall health')

plt.show()

在使用mplot3d绘制图形的情况下,网格是“有效”的,可以在此示例中看到:example。尽管如此,该网格似乎是“完美的”。我该如何创建这些网格?
3个回答

7
我正在将我的评论扩展为答案。正如DrV所提到的,linewidth被设置为零,因此我们需要在调用grid()时明确指定。还要考虑的另一件事是,网格将出现在绘图上方,因此需要指定zorder。如此帖子中所述,应使用zorder=0设置网格,并且绘图应具有大于3的值zorder=3
因此,没有网格的示例如下:
import numpy as np
import matplotlib.pyplot as plt

plt. xkcd()
x = np.linspace(0, 1)
y = np.sin(4 * np.pi * x) * np.exp(-5 * x)

plt.fill(x, y, 'r')
plt.grid(True)
plt.show()

给予: 没有网格的xkcd风格图 带网格的示例:
import numpy as np
import matplotlib.pyplot as plt

plt. xkcd()
x = np.linspace(0, 1)
y = np.sin(4 * np.pi * x) * np.exp(-5 * x)

plt.fill(x, y, 'r', zorder=3)
plt.grid(True, lw=0.5, zorder=0)
plt.show()

提供: 在此输入图片描述

3
第一个原因是你没有网格线:
In [43]: ax.xaxis.get_gridlines()
Out[43]: <a list of 0 Line2D gridline objects>

这是因为你没有设置 xticks:
In [47]: ax.get_xticks()
Out[47]: array([], dtype=float64)

这个问题可以通过添加一些引号来解决:
ax.set_xticks([20,50,80])
ax.set_yticks([-20,-10,0])

现在我们应该有一些网格线:
In [54]: ax.xaxis.get_gridlines()
Out[54]: <a list of 3 Line2D gridline objects>

很遗憾,没有任何内容可以显示。这是因为网格的宽度为零:

In [56]: ax.xaxis.get_gridlines()[0].get_linewidth()
Out[56]: 0.0

我们可以通过以下方式解决这个问题(更一般的方法请参见下文):
ax.xaxis.grid(linewidth=1.0)
ax.yaxis.grid(linewidth=1.0)

现在你拥有了:

输入图片说明

当然,在实践中,你可以根据需要设置x轴和y轴刻度(也许关闭刻度标记本身)。之后,你可以通过以下方式打开网格:

ax.grid(True, linewidth=1)

请注意,示例代码开头故意删除了勾号。

代码没有引号,你是对的。也许使用第一个超链接中的代码更好。感谢回答我的问题。 - nicoguaro
我还应该提到,如果我们希望网格在背景中,则需要明确说明它(请参见此帖子)。示例: from matplotlib import pyplot as plt import numpy as np x = np.linspace(0,10,200) plt.xkcd() plt.plot(x,np.sin(x), zorder=3); plt.grid(True, lw=1, zorder=0) plt.show() - nicoguaro

1

xkcd模式会直接更改以下两个rcParams,对网格线产生影响:

from matplotlib import rcParams

rcParams['axes.grid']= False     # defaults to False but xkcd() makes it False
rcParams['grid.linewidth']= 0.0  # defaults to 0.8

只需将这些内容更改为您需要的内容。如果您的图表中的网格线之前正常工作,并且xkcd模式破坏了网格线,则将这两个值设置为之前的值即可解决问题。除非您正在做比修复先前工作的图表更多的事情,否则无需重新制定zorders等内容。


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