Python 如何在xkcd绘图中创建轴网

Python 如何在xkcd绘图中创建轴网,python,matplotlib,Python,Matplotlib,我想在背景中创建一些带有网格的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.

我想在背景中创建一些带有网格的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进行绘图的情况下,网格正在“工作”,如图所示。尽管如此,网格似乎是完美的。如何创建网格?

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

In [43]: ax.xaxis.get_gridlines()
Out[43]: <a list of 0 Line2D gridline objects>
In [54]: ax.xaxis.get_gridlines()
Out[54]: <a list of 3 Line2D gridline objects>
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
这可以通过添加一些记号来解决:

ax.set_xticks([20,50,80])
ax.set_yticks([-20,-10,0])
现在我们应该有一些网格线:

In [43]: ax.xaxis.get_gridlines()
Out[43]: <a list of 0 Line2D gridline objects>
In [54]: ax.xaxis.get_gridlines()
Out[54]: <a list of 3 Line2D gridline objects>
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
我们可以通过以下方式解决此问题(请参见下文了解更通用的方法):

现在你有:

当然,在实践中,您可以根据自己的意愿设置x和y记号(也可以自行关闭记号)。之后,您只需通过以下方式设置网格:

ax.grid(True, linewidth=1)

在示例代码的开头,请不要故意删除勾号。

我将我的评论扩展为答案。正如DrV提到的,线宽设置为零,因此我们需要在调用
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()
给予:

网格的一个示例:

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()
给予:

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

In [43]: ax.xaxis.get_gridlines()
Out[43]: <a list of 0 Line2D gridline objects>
In [54]: ax.xaxis.get_gridlines()
Out[54]: <a list of 3 Line2D gridline objects>
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之类的东西,除非您所做的不仅仅是取消破坏以前的工作图表。

代码没有刻度,您是对的。也许使用第一个超链接中的那个是个更好的主意。谢谢你回答我的问题。我还应该提到,如果我们想让网格出现在背景中,我们需要明确地说出来(见此。示例:
从matplotlib导入pyplot作为plt导入numpy作为np x=np.linspace(0,10200)plt.xkcd()plt.plt(x,np.sin(x),zorder=3);plt.grid(True,lw=1,zorder=0)plt.show()