如何按天分组每小时绘制数据?

时间:2019-05-29 20:57:52

标签: python pandas matplotlib

背景:我从一个大的DataFrame中过滤了3日至9日(星期一至星期日)的year=2013month=June的条目。然后,我将数据按dayhouruser_type分组,然后旋转表以获取一个DataFrame,看起来像:

   Day  Hour  Casual  Registered  Casual_percentage
0  3    0     14      19          42.42
1  3    1     8       8           50.00
2  3    2     1       3           25.00
3  3    3     2       1           66.67
4  3    4     1       3           25.00
5  3    5     1       17          5.56
.  .    .     .       .           .

每天我有24小时,因此对于第4天(星期二),数据开始如下:

.  .    .     .       .           .  
21 3    21    32      88          26.67
22 3    22    26      64          28.89
23 3    23    23      30          43.40
24 4    0     10      11          47.62
25 4    1     1       5           16.67
26 4    2     1       1           50.00
.  .    .     .       .           .

如何为Casual的7个Registered中的每个Hour绘制DayDays变量?我需要创建7个不同的图并将它们对齐到1个图中吗?

当前代码。我觉得我要离开。我还尝试使用second x-axis创建一个documentation(用于def make_patch_spines_invisible(ax): ax.set_frame_on(True) ax.patch.set_visible(False) for sp in ax.spines.values(): sp.set_visible(False) fig, ax1 = plt.subplots(figsize=(10, 5)) ax1.set(xlabel='Hours', ylabel='Total # of trips started') ax1.plot(data.Hour, data.Casual, color='g') ax1.plot(data.Hour, data.Registered, color='b') """This part is trying to create the 2nd x-axis (Days)""" ax2 = ax1.twinx() #offset the bottom spine ax2.spines['bottom'].set_position(('axes', -.5)) make_patch_spines_invisible(ax2) #show bottomm spine ax2.spines['bottom'].set_visible(True) ax2.set_xlabel("Days") plt.show() )。

{{1}}

输出: enter image description here

End goal

2 个答案:

答案 0 :(得分:1)

我认为,如果您使用datetime对象而不是DayHour字符串,这应该会更容易。
这样,您将可以使用date tick locators and formatters  以及major and minor ticks

即使您没有提到它,我也假定您可以使用pandas处理数据帧。
我创建了一个新的数据框,方法是复制多次提供的数据并剪切其中的一些数据(这并不重要)。
在这里,我根据您提供的信息重建了日期,但我建议直接使用它们(我想原始数据框中有某种类似日期的字段)。

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

df = pd.read_csv("mydataframe.csv")
df["timestamp"] = "2013-06-" + df["Day"].astype(str).str.zfill(2) + "-" + df["Hour"].astype(str).str.zfill(2)
df["timestamp"] = pd.to_datetime(df["timestamp"], format="%Y-%m-%d-%H")


fig, ax1 = plt.subplots(figsize=(10, 5))
ax1.set(xlabel='', ylabel='Total # of trips started')
ax1.plot(df["timestamp"], df.Casual, color='g')
ax1.plot(df["timestamp"], df.Registered, color='b')

ax1.xaxis.set(
    major_locator=mdates.DayLocator(),
    major_formatter=mdates.DateFormatter("\n\n%A"),
    minor_locator=mdates.HourLocator((0, 12)),
    minor_formatter=mdates.DateFormatter("%H"),
)
plt.show()

输出:

formatted dataframe

答案 1 :(得分:0)

假设您的数据是按索引排序的(例如0-24是第3天,25-48是第4天,依此类推),则可以在代码中绘制索引值而不是小时数:

ax1.plot(data.index.values, df.Casual, color='g')
ax1.plot(data.index.values, df.Registered, color='b')

这将产生与您作为最终产品寻找的图形相似的图形(请注意,我使用了虚假数据):

enter image description here