【问题标题】:Combine Bar and Line subplots in pandas在 pandas 中组合条形图和线形子图
【发布时间】:2016-10-28 03:08:24
【问题描述】:

我想在子图中绘制 5 个时间序列。基本上我一直在使用子图:

fig, axes = plt.subplots(nrows=5, ncols=1, figsize=(16,10), sharex=True)
xlim = (start, end)
ax1=df.hr.plot(ax=axes[0], color='green', xlim=xlim)
ax2=df.act.plot(ax=axes[1], color='orange', xlim=xlim)
ax3=df.rr.plot(ax=axes[2], color='blue', xlim=xlim)
ax4=df2.set_index('timestamp').rmssd.plot(color='purple', ax=axes[3], xlim=xlim)
ax5=ma_df.tz_convert('US/Eastern')['any_act'].resample('10Min', how='count').plot(kind='line',ax=axes[4])

哪个产生

由于数据的性质,我想将最后一个子图可视化为条形图。所以很自然,我把最后一行改成:

ax5=ma_df.tz_convert('US/Eastern')['any_act'].resample('10Min', how='count').plot(kind='bar',ax=axes[4])

然后创建下图:

在最后一个子图中产生了我所期望的结果,但使其他图无用。不用说,这不是我想要的。

如何将 4 线时间序列与一个条形图组合在同一个图中,但不同的子图都共享相同的 x 轴? 这意味着我希望前 4 个子图像第一张图片一样,最后一个子图像第二张图片一样。

更新

我做了一个简单的例子,不幸的是,它按预期工作,并没有复制我的问题,这更令人费解。代码如下

import pandas as pd
from matplotlib import pyplot as plt
%matplotlib inline
df =  pd.read_csv('https://s3.amazonaws.com/temp-leonsas-qsaeamu0sl5v4b/df.csv')
bar_df = pd.read_csv('https://s3.amazonaws.com/temp-leonsas-qsaeamu0sl5v4b/bar_df.csv')
fig, axes = plt.subplots(nrows=4, ncols=1, figsize=(16,10), sharex=True)
ax1=df.hr.plot(ax=axes[0], color='green', kind='line')
ax2=df.act.plot(ax=axes[1], color='orange', kind='line')
ax3=df.rr.plot(ax=axes[2], color='blue', kind='line')
ax4=bar_df.occ_count.plot(ax=axes[3], kind='bar')

而我的代码库中复制问题的代码是

fig, axes = plt.subplots(nrows=4, ncols=1, figsize=(16,10), sharex=True)
ax1=df.hr.plot(ax=axes[0], color='green', kind='line')
ax2=df.act.plot(ax=axes[1], color='orange', kind='line')
ax3=df.rr.plot(ax=axes[2], color='blue', kind='line')
ax4=bar_df.occ_count.plot(ax=axes[3], kind='bar')

主要区别在于,在我的代码库中,DataFrame 是生成的,而不仅仅是从 s3 加载的。 DataFrame 中是否有隐式配置可以以某种方式实现这一点?我刚刚使用df.to_csv 将这两个数据帧转储到 S3 中。

【问题讨论】:

  • 您是否尝试过先调用条形图,然后再绘制线图?您可能会从重采样中获得不需要的帮助程序活动,但这不是一个完整的示例。至少提供虚拟数据并查看重现错误需要多少线图。 [MVCE]
  • @cphlewis 查看我在帖子中的更新。
  • 可能是索引略有不同,请在绘图前尝试在数据帧上调用reset_index
  • 如果 maxymoo 的建议不起作用,您可以缩小重现此问题所需的数据量。上半场?下半场?下半场的前半场?等

标签: python pandas matplotlib


【解决方案1】:

我认为您只需将kind='line' 显式传递给前三个图,这是一个更简单的示例:

import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline
s = pd.Series([1,2,3,2,1])
fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(16,10), sharex=True)
s.plot(ax=axes[0], color='green', kind='line')
s.plot(ax=axes[1], color='red', kind='bar')

【讨论】:

  • 这似乎无法解决问题。也许它与重采样有关?看看我的 2 个数字中,轴刻度标签的数量是如何不同的。
  • 嗯不知道......你能在你的问题中添加一些数据以使其可重现吗?
猜你喜欢
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多