Python matplotlib对齐双记号标记
是否可以用两个独立的y轴绘制一个图,以便记号对齐 下面是一半解决方案的示例。我已经使用twinx将y轴加倍,但是记号没有对齐,网格线在绘图上形成了一个笨拙的图案。是否有办法使记号共享相同的位置,但对应不同的y值?在下面的示例中,我希望左侧5的记号与右侧6的记号位于相同的垂直位置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.
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))
。