Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python matplotlib对齐双记号标记_Python_Matplotlib - Fatal编程技术网

Python matplotlib对齐双记号标记

Python matplotlib对齐双记号标记,python,matplotlib,Python,Matplotlib,是否可以用两个独立的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.

是否可以用两个独立的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)


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

您需要手动设置当前的
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)):


我知道这很旧,但这可能会在将来帮助一些人

我根据上面的解决方案制作了一个函数,确保标签不会以很多小数结束:

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))
输出:


对答案的补充姗姗来迟:对于那些在绘图中同时具有负值和正值的人,我找到的解决方案如下:

max1 = np.nanmax(ax1.get_ybound()) #in case you have nan values
max2 = np.nanmax(ax2.get_ybound())
ax1.set_yticks(np.linspace(-max1, max1, 5))
ax2.set_yticks(np.linspace(-max2, max2, 5))
这导致从零开始的对称轴距离,y轴上的零“线”对齐


set-yticks
的困难在于它在
min
max
之间进行计算,而不是
min
0
max

由于边界总是由两个数字定义(除非未定义),以下内容还会在已定义的轴边界之间创建5个点:
ax1.set_-yticks(np.linspace(*ax1.get_-ybound(),5)
@HAL9001,建议中缺少一个右括号。它应该是:
ax1.set_-yticks(np.linspace(*ax1.get_-ybound(),5))