【问题标题】:Grid lines in parasitic axes in matplotlibmatplotlib中寄生轴中的网格线
【发布时间】:2011-01-15 22:16:50
【问题描述】:

你能在matplotlib中用寄生轴画出网格线吗?

我尝试这个,基于网格和寄生轴的样本,但没有执行网格绘制:

from mpl_toolkits.axes_grid.parasite_axes import SubplotHost
import matplotlib.pyplot as plt

fig = plt.figure(1)

host = SubplotHost(fig, 111)
fig.add_subplot(host)

par = host.twinx()

host.set_xlabel("Distance")
host.set_ylabel("Density")
par.set_ylabel("Temperature")

p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density")
p2, = par.plot([0, 1, 2], [0, 3, 2], label="Temperature")

host.axis["left"].label.set_color(p1.get_color())
par.axis["right"].label.set_color(p2.get_color())

host.grid(True)

host.legend()

plt.show()

【问题讨论】:

    标签: python grid matplotlib


    【解决方案1】:

    here 的讨论看来,这是 .99 版本中的一个错误。

    (我不确定为什么它对 doug 有效,但 rcParams 的组合在 0.99.1.1-r1 版本上对我无效。)

    来自link 的答案是致电:

    host.toggle_axisline(False)
    

    toggle_axisline 所做的只是使 xaxis 和 yaxis (负责在 mainline mpl) 再次可见,并使 axis["bottom"] 等 看不见的。

    整个程序变成:

    from mpl_toolkits.axes_grid.parasite_axes import SubplotHost
    import matplotlib.pyplot as plt
    
    fig = plt.figure(1)
    
    host = SubplotHost(fig, 111)
    fig.add_subplot(host)
    
    par = host.twinx()
    
    host.set_xlabel("Distance")
    host.set_ylabel("Density")
    par.set_ylabel("Temperature")
    
    p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density")
    p2, = par.plot([0, 1, 2], [0, 3, 2], label="Temperature")
    
    host.axis["left"].label.set_color(p1.get_color())
    par.axis["right"].label.set_color(p2.get_color())
    
    host.toggle_axisline(False)
    host.grid(True)
    
    host.legend()
    
    plt.show()
    

    【讨论】:

    • 太棒了!但是,轴标签颜色会丢失。这不是至关重要的,我可以等到 1.0 版本。
    • 哦,谢谢!你救了我,我正要回去手动生成轴
    • @Mark the imageshak link was not working img52.imageshack.us/img52/4052/tmpxj.png 也许将其上传到更好的图片托管商,如 imgur?
    • @miguel,我在 5 年前回答了这个问题!那个画面好久不见了。考虑到,matplotlib 现在是 1.4.3 版,我不确定这个问题是否有效。
    【解决方案2】:

    对于这种类型的绘图,一目了然地判断哪个对象应该调用“网格”并不总是那么容易。

    解决这种不便的一种方法 - 即,无需更改任何代码并担心您是否有正确的对象调用“网格”即可在绘图上获取网格线 - 是编辑您的配置 文件。这可能足以让您准确地完成您需要做的事情,但以防万一:

    1. 下载示例 matplotlibrc 文件 here 或在 site-packages/matplotlib/mpl-data/ 中检索您的副本;

    2. 在该文件的第 195 行左右,查找标题(作为注释)“### AXES”;

    3. 该标题下方的五六行您将看到“axes-grid”--取消注释该行并将值设置为“True”;

    4. 现在将此文件读到第 235 行左右,您将在其中看到标题“### GRIDS”;

    5. 取消注释接下来的三行('grid.color'、'grid.linestyle' 和 grid.linewidth')并为这三个参数提供合理的值(我的是:'darkslategray'、':'、和 0.7,分别)。 (':' 值意味着我的网格线将是虚线。)

    6. 将该文件另存为:~/.matplotlibrc/matplotlibrc(换句话说,在您的顶级用户目录中创建一个名为“.matplotlibrc”的目录,不要忘记前导“.”,然后将其命名为您一直在编辑“matplotlibrc”的文件。

    就是这样。 (缺点是当您创建不需要网格线的绘图时 - 对于那些,我会保持此配置文件原样并根据需要创建其他配置文件并在它们之间切换(请参阅relevant Matplotlib page 了解如何这样做。)

    此外,使用 ipython 编辑此配置文件很容易——这可能是大多数用户的做法,但在这里可能会让人感到困惑。

    【讨论】:

    • @doug,我刚刚尝试过这个绘图类型,但网格仍然没有显示。此外,您可以使用 matplotlib.rcParams dict (matplotlib.sourceforge.net/users/customizing.html) 逐个脚本调整这些选项,这可能比维护单独的配置文件更容易。
    • 我知道这一点——我想让我的示例简单明了,并且仅限于解决您的问题。如果您没有看到网格,则说明您没有正确配置 matplotlib。正确配置后,它确实可以工作——我将您的代码粘贴到我的编辑器中并运行它,我得到了一个带有网格的绘图,正如我所料。
    • 抱歉没有跟进,伙计们。我有家庭健康问题,一旦我的笔记本电脑和我在同一个城市,我会尽快尝试你的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 2017-12-22
    • 1970-01-01
    相关资源
    最近更新 更多