折线图+不同频率的分组条形图[重复]

Posted

技术标签:

【中文标题】折线图+不同频率的分组条形图[重复]【英文标题】:Line chart + grouped bar chart with different frequency [duplicate] 【发布时间】:2021-12-27 08:34:08 【问题描述】:

我有 5 个频率不同的时间序列(pandas.core.series.Series 类),我想制作这个图表: desired chart

df1 (daily data, only working days) 
Date   exchange_rate_daily
2013-01-02  25.225
2013-01-03  25.26
2013-01-04  25.35
2013-01-07  25.535
2013-01-08  25.58
2013-01-09  25.53
2013-01-10  25.63
2013-01-11  25.615
2013-01-14  25.615
2013-01-15  25.61
2013-01-16  25.58
2013-01-17  25.54
2013-01-18  25.63
2013-01-21  25.625
       
df2 (monthly data for 2 time series)
Date intervention_monthly client_monthly
2013-01-01  0.6   0.67273
2013-02-01  0.2   0.04
2013-03-01  0.4   0.17443
2013-04-01  0.3   0.53883
2013-05-01  0.7   -0.0647
2013-06-01  0.2   0.20103
2013-07-01  0.0   0.22846
2013-08-01  0.0   -0.2611
2013-09-01  0.0   0.16002
2013-10-01  0.0  -0.10967
2013-11-01  7.4  -0.31122

折线图:

X 轴:date_exchangerate_daily(大小 = 2198,每日日期,即2013-01-02 00:00:00,但只有工作日 - 没有周末,没有节假日)

Y轴(左):`exchangerate_daily(大小=2198,每日汇率)

我的折线图代码运行良好。见下文:

fig, ax1 = plt.subplots(figsize=(10,6))
ax1.plot(date_exchangerate_daily, exchangerate_daily, color="k", label="Exchange rate (daily)", linewidth=2)
ax1.legend(loc = "upper left")

分组条形图:

X 轴:date_operations_monthly(大小 = 107,每月日期,例如2013-01-01 00:00:00

Y 轴(右):intervention_monthly(大小 = 107,每月数据)

Y 轴(右):client_monthly(大小 = 107,月度数据)

x = np.arange(len(date_operations_monthly))
width = 0.1
ax2 = ax1.twinx()
rects1 = ax2.bar(x - width/2, intervention_monthly, width, label='Intervention (monthly)')
rects2 = ax2.bar(x + width/2, client_monthly, width, label='Client operation (monthly)')
ax2.set_xticks(x)
ax2.set_xticklabels(date_operations_monthly2, rotation = 70)
ax2.legend(loc = "upper right") 

我得到了这张图表: chart

如果我单独绘制图表,我会得到正确的图表。因此,将这两个图表组合在一起存在问题。我想问题是数据频率不同,然后我想在 X 轴上绘制的日期系列(每天 x 每月日期)的大小不同。请问有什么解决办法吗?

非常感谢。

【问题讨论】:

欢迎来到这里!请阅读此***.com/questions/20109391/… 并编写一个可重现的最小示例 【参考方案1】:

由于没有可用数据,我使用股票价格数据并使用收盘价、交易量和另一个条形图的 1/2 交易量创建了一个条形图。 matplotlib时间序列是基于公历的,所以需要转换。更多信息请参见details。

import pandas as pd
import numpy as np
import io

data = '''
Date   exchange_rate_daily
2013-01-02  25.225
2013-01-03  25.26
2013-01-04  25.35
2013-01-07  25.535
2013-01-08  25.58
2013-01-09  25.53
2013-01-10  25.63
2013-01-11  25.615
2013-01-14  25.615
2013-01-15  25.61
2013-01-16  25.58
2013-01-17  25.54
2013-01-18  25.63
2013-01-21  25.625
'''

data1 = '''
Date intervention_monthly client_monthly
2013-01-01  0.6   0.67273
2013-02-01  0.2   0.04
2013-03-01  0.4   0.17443
2013-04-01  0.3   0.53883
2013-05-01  0.7   -0.0647
2013-06-01  0.2   0.20103
2013-07-01  0.0   0.22846
2013-08-01  0.0   -0.2611
2013-09-01  0.0   0.16002
2013-10-01  0.0  -0.10967
2013-11-01  7.4  -0.31122
'''
df1 = pd.read_csv(io.StringIO(data), delim_whitespace=True)
df2 = pd.read_csv(io.StringIO(data1), delim_whitespace=True)
df1['Date'] = pd.to_datetime(df1['Date'])
df2['Date'] = pd.to_datetime(df2['Date'])

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

fig, ax1 = plt.subplots(figsize=(12,6))
ax1.plot(mdates.date2num(df1['Date']), df1['exchange_rate_daily'], color="k", label="Exchange rate (daily)", linewidth=2)
ax1.legend(loc = "upper left")

#x = np.arange(len(df2))
width = 0.5
ax2 = ax1.twinx()
rects1 = ax2.bar(mdates.date2num(df2['Date']) - 1, df2['intervention_monthly'], width, label='Intervention (monthly)')
rects2 = ax2.bar(mdates.date2num(df2['Date']) + 1, df2['client_monthly'], width, label='Client operation (monthly)')
all_dates = sorted(df1['Date'][::5].tolist()+df2['Date'].tolist())
all_dates = mdates.date2num(all_dates)
ax2.set_xticks(all_dates)
ax2.set_xticklabels([mdates.num2date(d).strftime('%Y-%m-%d') for d in all_dates])
ax2.legend(loc = "upper right") 
ax1.tick_params(axis='x', labelrotation=90)

plt.show()

【讨论】:

一旦你理解了转换,时间序列图就变得不那么痛苦了。如果您觉得我的回答有帮助,请勾选信誉三角形按钮下的复选标记来接受我的回答。 您好,感谢您的帮助。不幸的是,在这部分代码:x = mdates.date2num(df.index) 我得到了这个错误:AttributeError: 'numpy.int64' object has no attribute 'toordinal' 产生此错误的代码将数据框的索引(本例中为日期)转换为matplotlib可以处理的日期格式。如果这里出现错误,则表示转换前的数据不是 pandas 日期格式,或者不是索引。这发生在我的所有代码中吗?一旦你在所有代码中运行它,看看每个数据是如何转换的,你就会有更好的理解。此外,此问题已被视为重复问题,但请告诉我,以便我帮助您解决问题。 好吧,那些类似的问题并不能回答我的问题。您的代码很好,但是您加载的数据框大小不同。对不起,我没有向您展示我的数据样本。我会在下一条评论中这样做。 我将数据样本添加到我的问题中

以上是关于折线图+不同频率的分组条形图[重复]的主要内容,如果未能解决你的问题,请参考以下文章

java生成饼状图,条形图,折线图的技术可以动态的显示

s-s-rS 2008 使用来自同一数据集的不同总和在条形图顶部绘制折线图

带折线图的条形图 - 使用非数字索引

从折线图开始的条形图

一个图形核心图中的折线图和条形图

多个组的ggplot条形图+折线图