【问题标题】:pandas plot mixing bars and lines熊猫情节混合条和线
【发布时间】:2020-09-20 09:30:23
【问题描述】:

我有两个 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】:

    编辑:

    我忘了你想要一个酒吧。

    另外,如果您不想弄乱所有这些datetime 的东西,您可以将年份绘制为 x 轴上的整数(月份为 1/12 分数)。但是我发现,一旦将所有内容都作为时间对象,使用datetime 就非常聪明。


    我不太熟悉直接从pandas 中绘制内容,但您可以在matplotlib 中轻松做到这一点。不过,我无法完全复制您的数据:要按照下面的示例,您必须将多索引转换为单个日期时间索引,我认为这是 would not be too hard

    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)
    

    如果您不能将其移植到您的案例中,我可以详细说明。

    【讨论】:

    • matplotlib 是我试图避免的一种解决方法,但它可能会起作用。但是,您将如何用条形图绘制第二行?
    • 非常有帮助。谢谢!
    猜你喜欢
    • 2023-03-17
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 2019-08-03
    • 2016-03-24
    • 2021-11-25
    • 2018-10-15
    • 1970-01-01
    相关资源
    最近更新 更多