【问题标题】:How to create grids in xkcd plots如何在 xkcd 图中创建网格
【发布时间】:2020-11-30 19:18:54
【问题描述】:

我想在背景中创建一些带有网格的 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 所示。虽然,网格似乎是完美。如何创建网格?

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    我正在将我的评论扩展为答案。正如 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()
    

    给予:

    【讨论】:

      【解决方案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)
      

      请不要在示例代码的开头故意删除刻度。

      【讨论】:

      • 代码没有刻度,你是对的。也许使用第一个超链接中的那个是一个更好的主意。感谢您回答我的问题。
      • 我还应该提到,如果我们希望网格在后台,我们需要明确地说出来(参见post。示例: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()
      【解决方案3】:

      xkcd 模式改变了以下 2 个直接影响网格线的 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 模式破坏了网格线,则将这两个值设置为之前的值应该可以解决问题。无需重新加工 zorder 等,除非您所做的不仅仅是恢复以前工作的图表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-18
        相关资源
        最近更新 更多