Matplotlib:使用twinx覆盖时,箱线图和条形图发生移动

Matplotlib:使用twinx覆盖时,箱线图和条形图发生移动,matplotlib,boxplot,twinx,Matplotlib,Boxplot,Twinx,当我创建一个条形图并使用twin x覆盖一个条形图时,与条形图相比,方框似乎向右移动了一个 这个问题在()之前已经确定,但解决方案似乎不再有效。(我正在使用Matplotlib 3.1.0) 输出显示与条形图相比,方框向右移动了1。上一篇帖子的回应者正确地指出,条的勾号位置是零基的,方框的勾号位置是一基的,这导致了这种变化。然而,应答者用来修复它的plt.bar()。如果提供了x参数,它仍然会抛出错误,因为不再有参数“left” df.boxplot(column='B', by='A') p

当我创建一个条形图并使用twin x覆盖一个条形图时,与条形图相比,方框似乎向右移动了一个

这个问题在()之前已经确定,但解决方案似乎不再有效。(我正在使用Matplotlib 3.1.0)

输出显示与条形图相比,方框向右移动了1。上一篇帖子的回应者正确地指出,条的勾号位置是零基的,方框的勾号位置是一基的,这导致了这种变化。然而,应答者用来修复它的
plt.bar()。如果提供了x参数,它仍然会抛出错误,因为不再有参数“left”

df.boxplot(column='B', by='A')
plt.twinx()
plt.bar(left=plt.xticks()[0], height=df.groupby('A').count()['B'],
  align='center', alpha=0.3)

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-186-e257461650c1> in <module>
     26 plt.twinx()
     27 plt.bar(left=plt.xticks()[0], height=df.groupby('A').count()['B'],
---> 28         align='center', alpha=0.3)

TypeError: bar() missing 1 required positional argument: 'x'
df.boxplot(column='B',by='A')
plt.twinx()
plt.bar(左=plt.xticks()[0],高=df.groupby('A').count()['B'],
对齐='中心',α=0.3)
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在里面
26 plt.twinx()
27 plt.bar(左=plt.xticks()[0],高=df.groupby('A').count()['B'],
--->28对齐=中心,α=0.3)
TypeError:bar()缺少1个必需的位置参数:“x”
此外,我更喜欢使用面向对象的方法对轴进行修复,因为我希望将图表放置到交互式ipywidget中

以下是理想的图表:


非常感谢。

您可以使用以下技巧:提供从
x=1开始放置条形图的x值。为此,使用
范围(1,len(df_gb['B'])+1)
作为x值

fig, ax = plt.subplots(figsize=(8, 4))
ax2 = ax.twinx()
df_gb = df.groupby('A').count()
df.boxplot(column='B', by='A', ax=ax)
ax2.bar(range(1, len(df_gb['B'])+1), height=df_gb['B'],align='center', alpha=0.3)

您可以使用以下技巧:提供从
x=1开始放置条形图的x值。为此,使用
范围(1,len(df_gb['B'])+1)
作为x值

fig, ax = plt.subplots(figsize=(8, 4))
ax2 = ax.twinx()
df_gb = df.groupby('A').count()
df.boxplot(column='B', by='A', ax=ax)
ax2.bar(range(1, len(df_gb['B'])+1), height=df_gb['B'],align='center', alpha=0.3)

巧妙的简单技巧。非常感谢。但是您知道如何使用对象定向进行此更改吗。我试过“使用对象定向进行此更改”的确切含义是什么?你的意思是从axis对象获取数据来放置酒吧?对不起,我是论坛的新参与者,可能无法很好地表达自己。我考虑过通过ax2=ax.twinx()将孪生轴分配给对象,然后在通过pandas包装器(df.bar(ax=ax2))发生事件时,可以灵活地将条分配给ax2。我尝试了ax2.set_xticks(ax2.get_xticks()+1),但这似乎只是移动了标签,而不是条。@nostalghia:检查我的编辑。我基本上将最后一行中的
plt
替换为
ax2
。这就是你指的吗?谢谢你的努力。看起来更像是我想要的。现在已经太晚了。我需要睡一会儿才能清醒过来。明天早上我会检查确认。干杯。巧妙的简单把戏。非常感谢。但是您知道如何使用对象定向进行此更改吗。我试过“使用对象定向进行此更改”的确切含义是什么?你的意思是从axis对象获取数据来放置酒吧?对不起,我是论坛的新参与者,可能无法很好地表达自己。我考虑过通过ax2=ax.twinx()将孪生轴分配给对象,然后在通过pandas包装器(df.bar(ax=ax2))发生事件时,可以灵活地将条分配给ax2。我尝试了ax2.set_xticks(ax2.get_xticks()+1),但这似乎只是移动了标签,而不是条。@nostalghia:检查我的编辑。我基本上将最后一行中的
plt
替换为
ax2
。这就是你指的吗?谢谢你的努力。看起来更像是我想要的。现在已经太晚了。我需要睡一会儿才能清醒过来。明天早上我会检查确认。干杯