如何在xkcd图中创建网格

时间:2014-07-28 03:58:19

标签: python matplotlib

我想在后台创建一些带网格的xkcd图。就像这个example一样,但当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 个答案:

答案 0 :(得分:4)

我正在将我的评论扩展为答案。正如DrV所提到的,线宽设置为零,因此我们需要在grid()的调用中明确指定。另外需要考虑的是网格将出现在图上,因此需要指定zorder。如此post中所述,网格应设置为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-style plot withtout grid

网格示例:

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()

,并提供: enter image description here

答案 1 :(得分:2)

第一个原因是你没有网格线:

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)

现在你有了:

enter image description here

当然,在练习中,您可以根据需要设置x和y刻度(也可以自行关闭刻度线)。之后,您可以通过以下方式设置网格:

ax.grid(True, linewidth=1)

请注意,在示例代码的开头,有意删除了刻度线。

答案 2 :(得分:1)

xkcd模式更改了以下两个直接影响网格线的rcParam:

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模式破坏了网格线,请将这两个值设置为之前的值即可解决此问题。除非您要做的不只是打破先前的工作图表,否则无需重新整理zorder等。