我想在后台创建一些带网格的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中所示。虽然,网格似乎完美。如何创建网格?
答案 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()
,并提供:
网格示例:
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()
,并提供:
答案 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)
现在你有了:
当然,在练习中,您可以根据需要设置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等。