绘制数据框:覆盖线和条形图不适用于时间序列索引?
Posted
技术标签:
【中文标题】绘制数据框:覆盖线和条形图不适用于时间序列索引?【英文标题】:plot dataframe: overlay line and bar plot doesn't work for time series index? 【发布时间】:2020-06-21 20:04:29 【问题描述】:import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# create dataframes df0 and df1:
index0 = pd.date_range(start='2014-06-01 00:00:00', end='2014-06-01 00:15:00', freq='1S')
data0 = np.random.rand(len(index0))
df0 = pd.DataFrame(data=data0, index=index0, columns=['DF0'])
index1 = pd.date_range(start='2014-06-01 00:00:00', end='2014-06-01 00:15:00', freq='15S')
data1 = np.random.rand(len(index1))
df1 = pd.DataFrame(data=data1, index=index1, columns=['DF1'])
# plot df0 and df1:
fig,ax1 = plt.subplots(figsize=(40,10))
ax2 = ax1.twinx()
df0.plot.line( color="r", ax = ax1)
df1.plot.bar( color ='b', linewidth = 5, ax = ax2, alpha = 0.7)
plt.show()
我可以将数据框叠加为两个线图或两个条形图。但是无论我多么努力,我都无法用条形图或相反的方式覆盖线图?使用上面的代码,我只能得到 df1 的条形图,但看不到 df0
的线形图。我有什么不同的做法?
【问题讨论】:
【参考方案1】:bar
plot 仅将分类(字符串)值作为 x 值。因此,简单的 hack 可以将时间戳转换为字符串。
当您输入浮点值时,它将它们转换为 str ,因此它们与线图 x 值的索引不匹配。
df0.index = df0.index.map(str)
此操作也不需要辅助轴。
试试这个!
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# create dataframes df0 and df1:
index0 = pd.date_range(start='2014-06-01 00:00:00',
end='2014-06-01 00:15:00', freq='1S')
data0 = np.random.rand(len(index0))
df0 = pd.DataFrame(data=data0, index=index0, columns=['DF0'])
df0.index = df0.index.map(str)
index1 = pd.date_range(start='2014-06-01 00:00:00',
end='2014-06-01 00:15:00', freq='15S')
data1 = np.random.rand(len(index1))
df1 = pd.DataFrame(data=data1, index=index1, columns=['DF1'])
# plot df0 and df1:
fig, ax1 = plt.subplots(figsize=(40, 10))
ax = df0.plot.line(color="r")
df1.plot.bar(color='b', linewidth=5, ax=ax, alpha=0.7)
plt.show()
【讨论】:
感谢您提供的非常有用的提示!我稍后会尝试并提供反馈!但是有一个问题:DF0 数据在条形图和折线图的组合中似乎已经从 1 秒变为 15 秒频率?我怎么能有一个原始的 1 秒频率的线图曲线? 我的印象是,不同的频率(1 秒和 15 秒)会导致问题,可以看出,如果我们更改线形图和条形图的顺序:首先绘制 df1:df1。 plot.bar(color='b', linewidth=5, ax=ax, alpha=0.7) 比 plot df0: df0.plot.line(color="r", ax = ax) / plt.show() df1 似乎压缩到 1/15以上是关于绘制数据框:覆盖线和条形图不适用于时间序列索引?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Seaborn 调色板不适用于 Pandas 条形图?