【问题标题】:matplotlib align twinx tick marksmatplotlib 对齐 twinx 刻度线
【发布时间】:2013-11-27 13:22:37
【问题描述】:

是否可以绘制具有两个独立 y 轴的图,以使刻度线对齐?

以下是解决方案的一半示例。我使用twinx 将 y 轴翻了一番,但刻度线未对齐,并且网格线在绘图上形成了一个尴尬的图案。有没有办法让刻度线共享相同的位置,但对应不同的 y 值?在下面的示例中,我希望左侧 5 的刻度线与右侧 6 的刻度线处于相同的垂直位置。

import numpy as np

a = np.random.normal(10, 3, size=20)
b = np.random.normal(20, 5, size=40)

fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.hist(a)
ax2.hist(b)

这个练习的重点是使两个轴的网格线重叠。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    您需要手动设置yticks,因为这些是自动计算的,会导致变化。添加如下内容:

    ax1.set_yticks(np.linspace(ax1.get_ybound()[0], ax1.get_ybound()[1], 5))
    ax2.set_yticks(np.linspace(ax2.get_ybound()[0], ax2.get_ybound()[1], 5))
    

    我们使用轴边界之间的 5 个点组成的数组来设置 ytick 位置。由于您有一个直方图,您可以在每种情况下将下限值设置为零,并且您可能希望上限稍大一些,所以我会改为

    ax1.set_yticks(np.linspace(0, ax1.get_ybound()[1]+1, 5))
    ax2.set_yticks(np.linspace(0, ax2.get_ybound()[1]+1, 5))
    

    给出一个图(为了清晰起见,改变了颜色和透明度(alpha)):

    【讨论】:

    • 由于边界始终由两个数字定义(除非未定义),因此以下还会在已定义的轴边界之间创建 5 个点:ax1.set_yticks(np.linspace(*ax1.get_ybound(),5)
    • @HAL9001,您的建议中缺少右括号。应该是:ax1.set_yticks(np.linspace(*ax1.get_ybound(),5)).
    【解决方案2】:

    我知道这已经过时了,但这可能会对将来的某些人有所帮助。

    我根据上面的解决方案制作了一个函数,以确保标签最终不会是带有很多小数的东西:

    def calculate_ticks(ax, ticks, round_to=0.1, center=False):
        upperbound = np.ceil(ax.get_ybound()[1]/round_to)
        lowerbound = np.floor(ax.get_ybound()[0]/round_to)
        dy = upperbound - lowerbound
        fit = np.floor(dy/(ticks - 1)) + 1
        dy_new = (ticks - 1)*fit
        if center:
            offset = np.floor((dy_new - dy)/2)
            lowerbound = lowerbound - offset
        values = np.linspace(lowerbound, lowerbound + dy_new, ticks)
        return values*round_to
    

    使用方式如下:

    ax1.set_yticks(calculate_ticks(ax1, 10))
    ax2.set_yticks(calculate_ticks(ax2, 10))
    

    输出:

    【讨论】:

      【解决方案3】:

      迟来的答案:对于那些在他们的情节中同时具有负值和正值的人,我找到的解决方案如下:

      max1 = np.nanmax(ax1.get_ybound()) #in case you have nan values
      max2 = np.nanmax(ax2.get_ybound())
      nticks = 5 #or other odd number
      ax1.set_yticks(np.linspace(-max1, max1, nticks))
      ax2.set_yticks(np.linspace(-max2, max2, nticks))
      

      这会导致轴对称距离为零,y 轴上的零“线”对齐。

      set_yticks 的难点在于它在minmax 之间进行计算,而不是min0max

      【讨论】:

        猜你喜欢
        • 2017-12-15
        • 1970-01-01
        • 1970-01-01
        • 2013-03-30
        • 2017-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多