Python Matplotlib-将折线图覆盖在条形图上并对齐yticks

Python Matplotlib-将折线图覆盖在条形图上并对齐yticks,python,matplotlib,Python,Matplotlib,我试图在条形图上绘制一个折线图,但刻度和点的实际位置都没有对齐。我希望它们对齐。(请注意,我将在另一侧绘制另一组类似(但反向)的数据,因此是子图。) 这是我到目前为止所拥有的 import matplotlib.pyplot as plt import numpy as np group = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55] amount1 = [967, 975, 1149, 1022, 852, 975, 1025, 1134, 9

我试图在条形图上绘制一个折线图,但刻度和点的实际位置都没有对齐。我希望它们对齐。(请注意,我将在另一侧绘制另一组类似(但反向)的数据,因此是子图。)

这是我到目前为止所拥有的

import matplotlib.pyplot as plt
import numpy as np
group = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55]
amount1 = [967, 975, 1149, 1022, 852, 975, 1025, 1134, 994, 1057, 647, 1058]
amount2 = [286, 364, 111, 372, 333, 456, 258, 152, 400, 181, 221, 441]

f, (ax1, ax2) = plt.subplots(nrows = 1, ncols = 2, sharey=True, figsize = (17,8))
ax1_2 = ax1.twinx()

# y_pos
y_pos = np.arange(len(group))

# plot men
ax1.barh(y_pos, amount1, align = 'center')
ax1_2.plot(amount2, group, color = 'black', marker = 'o')

# ticks
ax1.set_yticks(y_pos)
ax1.set_yticklabels(group)
ax1.invert_xaxis()
ax1.yaxis.tick_right()

# padding
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.05, hspace=None)

plt.show()
plt.close()

我试过设置刻度,但条形图和线形图的概念似乎非常不同。我也尝试在ax1上绘制这两个图形,但是线图远远超出了条形图,它们根本没有对齐。我也尝试过
ax1\u 2.set\u yticks(ax1.get\u yticks())
,但这也有类似的问题


任何帮助都将不胜感激

主要问题是两个轴的
ylim
s未对齐。
barh
绘图的
y
类似于0、1、2、3到11。直线图的
y
以5步为单位从0到55。要对齐它们,只需执行
ax1\u 2.set\u ylim([y*5代表ax1中的y.get\u ylim()])

另一种方法是对线形图也使用
ypos
。然后可以简单地复制限制:
ax1\u 2.set\u ylim(ax1.get\u ylim())

以下是示例代码,为了简单起见,省略了第二个图形:

导入matplotlib.pyplot作为plt
将numpy作为np导入
组=[0,5,10,15,20,25,30,35,40,45,50,55]
数量1=[967975114910228529751025113499410571576471058]
数量2=[28636411137233456258152400181221441]
f、 ax1=plt.子批次()
ax1_2=ax1.twinx()
#y_pos
y_pos=np.arange(len(集团))
#阴谋家
ax1.barh(y_位置,数量1,对齐并居中,颜色为绿松石色)
ax1_2.绘图(数量2,组,颜色为深红色,标记为o)
ax1_2.set_ylim([y*5代表ax1中的y.get_ylim()]))
#滴答声
ax1.设置锁定(y位置)
ax1.设置标签(组)
ax1.yaxis.tick_right()
ax1.invert_xaxis()
plt.show()

现在,绘图的0、10、20个刻度变暗,因为它们来自
ax1\u 2
。只需调用
ax1\u 2。设置\u yticks([])
即可删除这些

PS:还有另一种方法,就是忘记
ypos
,只对
ax1
的y轴使用
group
。然后需要调整杆的高度,例如,将其调整为4.5,因为现在是以
组的单位测量的

代码:

ax1.barh(组、数量1、对齐=中心、颜色=绿松石、高度=4.5)
ax1_2.绘图(数量2,组,颜色为深红色,标记为o)
ax1_2.set_ylim(ax1.get_ylim())#不需要标签,因为记号具有相同的值
ax1.设置锁定(组)
ax1\u 2.设置检查([])
ax1.yaxis.tick_right()
ax1.invert_xaxis()

主要问题是两个轴的
ylim
s未对齐。
barh
绘图的
y
类似于0、1、2、3到11。直线图的
y
以5步为单位从0到55。要对齐它们,只需执行
ax1\u 2.set\u ylim([y*5代表ax1中的y.get\u ylim()])

另一种方法是对线形图也使用
ypos
。然后可以简单地复制限制:
ax1\u 2.set\u ylim(ax1.get\u ylim())

以下是示例代码,为了简单起见,省略了第二个图形:

导入matplotlib.pyplot作为plt
将numpy作为np导入
组=[0,5,10,15,20,25,30,35,40,45,50,55]
数量1=[967975114910228529751025113499410571576471058]
数量2=[28636411137233456258152400181221441]
f、 ax1=plt.子批次()
ax1_2=ax1.twinx()
#y_pos
y_pos=np.arange(len(集团))
#阴谋家
ax1.barh(y_位置,数量1,对齐并居中,颜色为绿松石色)
ax1_2.绘图(数量2,组,颜色为深红色,标记为o)
ax1_2.set_ylim([y*5代表ax1中的y.get_ylim()]))
#滴答声
ax1.设置锁定(y位置)
ax1.设置标签(组)
ax1.yaxis.tick_right()
ax1.invert_xaxis()
plt.show()

现在,绘图的0、10、20个刻度变暗,因为它们来自
ax1\u 2
。只需调用
ax1\u 2。设置\u yticks([])
即可删除这些

PS:还有另一种方法,就是忘记
ypos
,只对
ax1
的y轴使用
group
。然后需要调整杆的高度,例如,将其调整为4.5,因为现在是以
组的单位测量的

代码:

ax1.barh(组、数量1、对齐=中心、颜色=绿松石、高度=4.5)
ax1_2.绘图(数量2,组,颜色为深红色,标记为o)
ax1_2.set_ylim(ax1.get_ylim())#不需要标签,因为记号具有相同的值
ax1.设置锁定(组)
ax1\u 2.设置检查([])
ax1.yaxis.tick_right()
ax1.invert_xaxis()

您可以在
ax1
中绘制这两个变量,并删除
y\u pos
,因为在最后,它们都以
y
坐标的形式共享
变量

然后,可以将
高度
添加到条形图中

这里是代码:

import matplotlib.pyplot as plt

group = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55]
amount1 = [967, 975, 1149, 1022, 852, 975, 1025, 1134, 994, 1057, 647, 1058]
amount2 = [286, 364, 111, 372, 333, 456, 258, 152, 400, 181, 221, 441]

f, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, sharey=True, figsize=(17, 8))

# plot men
a = ax1.barh(group, amount1, height=4)
ax1.plot(amount2, group, color='black', marker='o')

# ticks
ax1.set_yticks(group)
ax1.set_yticklabels(group)
ax1.invert_xaxis()
ax1.yaxis.tick_right()

# padding
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.05,
                    hspace=None)

plt.show()
plt.close() 
以及一个具有结果的图像:


您可以在
ax1
中绘制这两个变量,并删除
y\u pos
,因为在最后,它们都以
y
坐标的形式共享
变量

然后,可以将
高度
添加到条形图中

这里是代码:

import matplotlib.pyplot as plt

group = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55]
amount1 = [967, 975, 1149, 1022, 852, 975, 1025, 1134, 994, 1057, 647, 1058]
amount2 = [286, 364, 111, 372, 333, 456, 258, 152, 400, 181, 221, 441]

f, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, sharey=True, figsize=(17, 8))

# plot men
a = ax1.barh(group, amount1, height=4)
ax1.plot(amount2, group, color='black', marker='o')

# ticks
ax1.set_yticks(group)
ax1.set_yticklabels(group)
ax1.invert_xaxis()
ax1.yaxis.tick_right()

# padding
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.05,
                    hspace=None)

plt.show()
plt.close() 
以及一个具有结果的图像: