pandas绘制混合条和线

问题描述 投票:0回答:1

我有两个groupby操作的结果,第一个。m_y_count,以这种多索引格式(第一列年,第二列月)。

2007    12    39
2008    1     3
        2     120
2009    6     1000
2010    1     86575
        2     726212
        3     2987954
        4     3598215
        6     160597

而另一个: y_count只有年。

2007    69
2008    3792
2009    5
2010    791

我的问题是,我如何在同一图中用不同的(对数)y轴来绘制它们?m_y_count 杠杠的 y_count 用一条带标记的线?

我的尝试。

ax = y_count.plot(kind="bar", color='blue', log = True)
ax2 = ax.twinx()
m_y_count.plot(kind="bar", color='red', alpha = 0.5, ax = ax2)

这将产生两个熊猫系列的条形图,但当我试着改成: kind="line" 在第一行,没有出现一行。

有什么提示可以进行吗?谢谢!

python pandas matplotlib pandas-groupby python-datetime
1个回答
0
投票

编辑。

我忘了你要的是条形的

另外,如果你不想搞这些东西的话 datetime 的东西,你可以直接在x轴上以整数的形式绘制年份(月份是112个小数)。 但我发现使用 datetime 是相当聪明的,一旦你把所有的东西作为时间对象。


我不太熟悉直接从 pandas但你可以很容易地在 matplotlib. 我不能完全复制你的数据,虽然:按照下面的例子,你必须将你的多索引转换为一个单一的日期时间索引,我想这是 不难.

import datetime as dt
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

#making fake data
dates1 = pd.date_range('12-01-2007','06-01-2010',periods=9)
data1 = np.random.randint(0,3598215,9)
df1 = pd.DataFrame(data1,index=dates1,columns=['Values'])
dates2 = pd.date_range('01-01-2006',periods=4,freq='1Y') #i don't get why but this starts at the end of 2006, near 2007
df2 = pd.DataFrame([69,3000,5,791],index=dates2,columns=['Values'])

#plotting
fig, ax = plt.subplots()
ax.bar(df2.index,df2['Values'],width=dt.timedelta(days=200),color='red',label='df2')
ax.set_yscale('log')
ax.set_ylabel('DF2 values',color='red')

ax2 = ax.twinx()
ax2.plot(df1.index,df1['Values'],color='blue',label='df1')
ax2.set_yscale('log',)
ax2.set_ylabel('DF1 values',color='blue')

years = mdates.YearLocator() #locate years for the ticks
ax.xaxis.set_major_locator(years) #format the ticks to just show years
xfmt = mdates.DateFormatter('%Y')
ax.xaxis.set_major_formatter(xfmt)

ax.legend(loc=0)
ax2.legend(loc=2)

enter image description here

如果你不能把这个移植到你的案例中,我可以详细说明。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.