【问题标题】:how can I fill the area in this plot?我怎样才能填充这个地块的区域?
【发布时间】:2019-02-27 06:48:11
【问题描述】:

我想填写下图中的蓝色“位置”部分。数据本身标志着重大位置变化的发生,是 15 分钟样本的时间序列,并重复最后一个位置,直到发生新的位置变化事件。例如,一旦注册了“home”,它的列保持为 1,其他所有内容为 0。然后当接下来访问“work”时,该列变为 1,并且 home 在 0 处加入其他列。

u1 = userLocAppDfs['user_3'].copy()
# https://stackoverflow.com/questions/11927715/how-to-give-a-pandas-matplotlib-bar-graph-custom-colors
locations = [(x/8.75, x/40.0, 0.85) for x in range(5)] # color grad

u1[[' bar', ' grocers', ' home', ' lunch', ' work']].plot(color=locations, figsize=(15,10))

u1[' app_3'].plot(color='orange')
u1[' app_1'].plot(color='r')

我注意到 fillstyle='full' 没有做任何事情。填充图表区域的正确方法是什么?

样本数据

    app_1   app_2   user    bar grocers home    lunch   park    relatives   work
date                                        
2017-08-29 14:00:00 0.013953    0.052472    user_1  0.0 0.0 0.0 0.0 0.0 0.0 1.0
2017-08-29 14:15:00 0.014070    0.052809    user_1  0.0 0.0 0.0 0.0 0.0 0.0 1.0
2017-08-29 14:30:00 0.014186    0.053146    user_1  0.0 0.0 1.0 0.0 0.0 0.0 0.0
2017-08-29 14:45:00 0.014302    0.053483    user_1  0.0 0.0 1.0 0.0 0.0 0.0 0.0
2017-08-29 15:00:00 0.014419    0.053820    user_1  0.0 0.0 1.0 0.0 0.0 0.0 0.0

【问题讨论】:

  • 反对票应附有评论
  • 不是投反对票的人,但是,请告诉我们投反对票的评论规定在哪里?
  • 如果您还没有添加评论,它实际上会告诉您何时投反对票
  • 对我来说不是,不是。不管。元数据上有很多讨论这个问题的线程,普遍的共识是没有要求评论。
  • 公平地说。不,我看不出你的问题有什么特别的问题。

标签: python matplotlib


【解决方案1】:

我认为直接从 DataFrame 中使用 pandas 绘图是不可能的,但您可以使用 matplotlib 中的 fill_between。您需要在数据框的每一列(“bar”、“home”、“work”等)上执行此操作。您可以手动创建一个轴并告诉 matplotlib 和 pandas 在该轴上绘图

import matplotlib.pyplot as plt
fig, ax = plt.subplots(1,1)
for location in [' bar', 'grocers', ' home']:  # or whatever subset of columns you want
    ax.fill_between(range(len(u1[location]), u1[location], step='post')

u1[' app_3'].plot(ax=ax, color='orange')
# etc..

附: fillstyle 参数适用于每个数据点都有一个标记并且想要修改其外观时:https://matplotlib.org/gallery/lines_bars_and_markers/marker_fillstyle_reference.html


编辑:使用您提供的数据更新示例。我修改了数据,在工作和家庭之间的栏上添加了一个停靠点,以提供更好看的情节。

import matplotlib.pyplot as plt
import pandas as pd

columns = ['date', 'app_1', 'app_2', 'user', 'bar', 'grocers', 'home', 'lunch', 'park', 'relatives', 'work']
data = [['2017-08-29 14:00:00', 0.013953, 0.052472, 'user_1', 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0], ['2017-08-29 14:15:00', 0.014070, 0.052809, 'user_1', 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0], ['2017-08-29 14:30:00', 0.014186, 0.053146, 'user_1', 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0], ['2017-08-29 14:45:00', 0.014302, 0.053483, 'user_1', 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0], ['2017-08-29 15:00:00', 0.014419, 0.053820, 'user_1', 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0]]

df = pd.DataFrame(data, columns=columns)
height = df[['app_1', 'app_2']].max().max()

fig, ax = plt.subplots(1,1)

df['app_1'].plot(ax=ax, color='orange')
df['app_2'].plot(ax=ax, color='purple')
ax.fill_between(range(len(df['home'])), height * df['home'], step='post', color='blue')
ax.fill_between(range(len(df['work'])), height * df['work'], step='post', color='red')

plt.show()

数据如下所示:

                  date     app_1     app_2    user  bar  grocers  home  lunch  park  relatives  work
0  2017-08-29 14:00:00  0.013953  0.052472  user_1  0.0      0.0   0.0    0.0   0.0        0.0   1.0
1  2017-08-29 14:15:00  0.014070  0.052809  user_1  0.0      0.0   0.0    0.0   0.0        0.0   1.0
2  2017-08-29 14:30:00  0.014186  0.053146  user_1  1.0      0.0   0.0    0.0   0.0        0.0   0.0
3  2017-08-29 14:45:00  0.014302  0.053483  user_1  0.0      0.0   1.0    0.0   0.0        0.0   0.0
4  2017-08-29 15:00:00  0.014419  0.053820  user_1  0.0      0.0   1.0    0.0   0.0        0.0   0.0

看起来像这样:

【讨论】:

  • 嗨 Mskoh52 -- 我试过ax.fill_between(len(u1[location]), u1[location]) -- 它实际上并没有填充任何空间(并且渲染时间明显更长)。它还分成两个图表,一个带有应用程序行,另一个带有位置数据。你能给我更清楚一点吗?
  • 我会添加一些示例数据来查看
  • 对不起,意思是写 range(len(u1[location])),它将 x 位置设置为填充。如果您的数据位于不同的 x 位置,则需要更改它。
  • 修复了一些东西并用你的示例数据做了一个演示
  • 哇,谢谢!这是实际数据的一部分,太棒了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多