gpt4 book ai didi

python - 在 SecondaryAxis 上绘制网格线 - Matplotlib

转载 作者:行者123 更新时间:2023-12-03 21:45:23 25 4
gpt4 key购买 nike

问题
我正在尝试从我的 SecondaryAxis 的刻度中绘制网格线

ax2.grid(color=color,linestyle='--')
图中没有显示任何内容,我相信我的情况与 Format SecondaryAxis ticklabels Matplotlib 相同,不是吗?
但是,是否有人可以在不颠倒比例的情况下解决此问题?我的意思是通过反转刻度是在主轴上有百分比刻度,在辅助轴上有正常刻度。
完整代码
import matplotlib.pyplot as plt
import numpy as np

#generate dummy load duration curve
dur=2500
load = np.random.normal(60,30,dur+1)
load[::-1].sort()

x=range(0,dur+1)

perticks = np.linspace(0,1,11)
xticks = perticks*dur

# get yticks from xticks
yticks = np.interp(xticks, range(0,dur+1), load)
print(yticks)

# create figure object with axe object
fig, ax1 = plt.subplots(figsize=(16, 8))
ax1.plot(x, load)

#create second axis
ax2 = ax1.secondary_yaxis('right')

# label and color of the secondaryaxis
perlabels = ['0%', '10%', '20%', '30%', '40%', '50%', '60%', '70%', '80%', '90%', '100%']
color ='tab:blue'

ax2.set_yticks(yticks)
ax2.set_yticklabels(labels=perlabels)
ax2.tick_params(axis='y', color=color, labelcolor=color)

# draw grid lines on the secondaryaxis
ax2.grid(color=color,linestyle='--')

# do the same for x axis
ax3 = ax1.secondary_xaxis('top')

ax3.set_xticks(xticks)
ax3.set_xticklabels(labels=perlabels)
ax3.tick_params(axis='x', color=color, labelcolor=color)

ax3.grid(color=color,linestyle='--')
输出
plot without the grid lines

最佳答案

我对这个话题做了一些挖掘,并打开了一个 issue在 GitHub 上。这是我发现的:

  • SecondaryAxis 是“相当新的东西”,在 matplotlib 3.1.0 中添加。 (2019 年 5 月)。甚至 v.3.3.3 docs say secondary_xaxis()方法是实验性的。
  • SecondaryAxis继承自 _AxesBase ,这是一个“implementation detail”。不应该(从 v.3.3.3 开始)作为 Axes 工作对象,以及 SecondaryAxis.grid()不应该画任何东西(就像 _AxesBase.grid() 那样)。虽然,我同意有一种非工作方法是误导性的。
  • 因此,在撰写本文时,.grid()仅假设在主轴上工作。

  • 使蓝轴为主
  • .grid()仅适用于非辅助轴,您将主轴设为蓝色,并将其移动到顶部和右侧。

  • 代码
    # Take the x and y-ticks for transfering them to secondary axis
    xticks_orig = ax1.get_xticks()
    yticks_orig = ax1.get_yticks()

    # Make the primary axis blue since we want to draw grid on it
    ax1.xaxis.tick_top()
    ax1.yaxis.tick_right()
    ax1.set_xticks(xticks)
    ax1.set_yticks(yticks)
    ax1.set_yticklabels(labels=perlabels)
    ax1.set_xticklabels(labels=perlabels)
    ax1.tick_params(axis="both", color=color, labelcolor=color)
    ax1.grid(color=color, linestyle="--")

    # Draw the black secondary axis
    ax2 = ax1.secondary_yaxis("left")
    ax3 = ax1.secondary_xaxis("bottom")
    ax2.set_yticks(yticks_orig)
    ax3.set_xticks(xticks_orig)
    example
    手动添加网格线
    您也可以手动添加网格线,就像这样
    xlim = ax1.get_xlim()
    for y in ax2.get_yticks():
    ax1.plot(xlim, (y, y), ls="--", color=color, lw=0.5)
    ax1.set_xlim(xlim)

    ylim = ax1.get_ylim()
    for x in ax3.get_xticks():
    ax1.plot((x, x), ylim, ls="--", color=color, lw=0.5)
    ax1.set_ylim(ylim)
    输出将如下所示:
    enter image description here
    这里的区别是现在我们在图形上绘制看起来像网格线的线。

    关于python - 在 SecondaryAxis 上绘制网格线 - Matplotlib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64784834/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com