matplotlib 带两条条形和两个y轴的条形图

eh57zj3b  于 2023-05-18  发布在  其他
关注(0)|答案(4)|浏览(252)

我有一个DataFrame看起来像这样:

amount     price
age
A     40929   4066443
B     93904   9611272
C    188349  19360005
D    248438  24335536
E    205622  18888604
F    140173  12580900
G     76243   6751731
H     36859   3418329
I     29304   2758928
J     39768   3201269
K     30350   2867059

现在我想画一个条形图,X轴上的年龄作为标签。对于每个x刻度应该有两个条形,一个条形代表金额,一个条形代表价格。我可以通过简单地使用它来实现这个工作:

df.plot(kind='bar')

问题是缩放。价格高得多,我无法真正确定图表中的金额,请参阅:

所以我想要第二个y轴。我试着用:

df.loc[:,'amount'].plot(kind='bar')
df.loc[:,'price'].plot(kind='bar',secondary_y=True)

但这只是覆盖了条形图,并没有将它们并排放置。有没有什么方法可以在不访问底层matplotlib的情况下做到这一点(这显然可以通过手动并排放置条形图)?
现在,我在子图中使用两个单独的图:

df.plot(kind='bar',grid=True,subplots=True,sharex=True);

导致:

nwlls2ji

nwlls2ji1#

使用新的pandas版本(0.14.0或更高版本),下面的代码将工作。为了创建两个轴,我手动创建了两个matplotlib轴对象(axax2),它们将用于两个条形图。
打印Dataframe时,可以使用ax=...选择轴对象。另外,为了防止两个图重叠,我修改了它们与position关键字参数对齐的位置,默认为0.5,但这意味着两个条形图重叠。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from io import StringIO

s = StringIO("""     amount     price
A     40929   4066443
B     93904   9611272
C    188349  19360005
D    248438  24335536
E    205622  18888604
F    140173  12580900
G     76243   6751731
H     36859   3418329
I     29304   2758928
J     39768   3201269
K     30350   2867059""")

df = pd.read_csv(s, index_col=0, delimiter=' ', skipinitialspace=True)

fig = plt.figure() # Create matplotlib figure

ax = fig.add_subplot(111) # Create matplotlib axes
ax2 = ax.twinx() # Create another axes that shares the same x-axis as ax.

width = 0.4

df.amount.plot(kind='bar', color='red', ax=ax, width=width, position=1)
df.price.plot(kind='bar', color='blue', ax=ax2, width=width, position=0)

ax.set_ylabel('Amount')
ax2.set_ylabel('Price')

plt.show()

utugiqy6

utugiqy62#

你只需要写:df.plot(kind= 'bar',secondary_y= ' amount '

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from io import StringIO
s = StringIO("""     amount     price
A     40929   4066443
B     93904   9611272
C    188349  19360005
D    248438  24335536
E    205622  18888604
F    140173  12580900
G     76243   6751731
H     36859   3418329
I     29304   2758928
J     39768   3201269
K     30350   2867059""")
df = pd.read_csv(s, index_col=0, delimiter=' ', skipinitialspace=True)

_ = df.plot( kind= 'bar' , secondary_y= 'amount' , rot= 0 )
plt.show()

ccgok5k5

ccgok5k53#

下面是另一个方法:

  • 创建左轴中的所有条
  • 通过改变它的transform属性将一些条移动到右边的坐标轴

代码如下:

import pylab as pl
df = pd.DataFrame(np.random.rand(10, 2), columns=["left", "right"])
df["left"] *= 100

ax = df.plot(kind="bar")
ax2 = ax.twinx()
for r in ax.patches[len(df):]:
    r.set_transform(ax2.transData)
ax2.set_ylim(0, 2);

下面是输出:

pqwbnv8z

pqwbnv8z4#

正如InLaw所提到的,你应该使用secondary_y = 'amount'
在这里补充他的答案是如何为两个轴设置ylabels

df.plot.bar(figsize=(15,5), secondary_y= 'amount')

ax1, ax2 = plt.gcf().get_axes() # gets the current figure and then the axes

ax1.set_ylabel('price')

ax2.set_ylabel('amount')

相关问题