无法使用Matplotlib和Python在x轴上绘制时间直方图

无法使用Matplotlib和Python在x轴上绘制时间直方图,python,pandas,matplotlib,plot,Python,Pandas,Matplotlib,Plot,我正在尝试绘制一个用户在一天中特定时间发推特的次数。我计划用24个“箱子”在柱状图/条形图上绘制这些箱子-每小时一个 我在熊猫数据框中有两列数据——tweet和tweet的时间(作为datetime对象) 我已将时间列转换为熊猫时间,但我很难正确绘制。如果我将bins的值设置为24,那么我会得到下面的图表(),它看起来不正确。首先,图表看起来不对,但第二,x轴的格式很糟糕 我想尝试解决这两个问题。首先是数据打印不正确,其次是横轴格式不正确 我用谷歌表格绘制了数据,正确的图表应该是这样的。我不介意

我正在尝试绘制一个用户在一天中特定时间发推特的次数。我计划用24个“箱子”在柱状图/条形图上绘制这些箱子-每小时一个

我在熊猫数据框中有两列数据——tweet和tweet的时间(作为datetime对象)

我已将时间列转换为熊猫时间,但我很难正确绘制。如果我将bins的值设置为24,那么我会得到下面的图表(),它看起来不正确。首先,图表看起来不对,但第二,x轴的格式很糟糕

我想尝试解决这两个问题。首先是数据打印不正确,其次是横轴格式不正确

我用谷歌表格绘制了数据,正确的图表应该是这样的。我不介意数值是总体积的%还是绝对体积的%

可以在此处找到生成绘图的代码。及

非常感谢您的帮助

plot_data.py

生成_data.py


嗯。所以你只想从约会时间开始有时间。试着替换

df["Time"]= pd.to_datetime(data["Time"], format="%H:%M")

我试着策划你在对Serge de Gosson de Varennes的回答的评论中分享的问题。在
plot\u data.py
脚本中,我唯一需要更改的是日期
格式
,我在其中添加了秒数。其余部分按预期工作,x轴的时间处理正确

下面是一个为方便起见创建直方图的示例。包含
weights
参数以生成带有百分比的图形。大部分代码用于格式化:

import numpy as np                 # v 1.19.2
import pandas as pd                # v 1.1.3
import matplotlib.pyplot as plt    # v 3.3.2
import matplotlib.dates as mdates

# Import data from html table into pandas dataframe
url = 'https://docs.google.com/spreadsheets/d/e/2PACX-1vTc97VEzlfDP_jEkjC7dTbJzcLBLDQeFwPMg6E36BaiH5qkhnedSz8wsVGUMyW6kt85rD20BcTMbvqp/pubhtml'
table, = pd.read_html(url, header=[1], index_col=1)
df = table.iloc[:, 1:]

# Save time variable as a pandas series of datetime dtype
time_var = pd.to_datetime(df['Time'], format='%H:%M:%S')

# Plot variable with pandas histogram function
ax = time_var.hist(bins=24, figsize=(10,5), grid=False, edgecolor='white', zorder=2,
                   weights=np.ones(time_var.size)/time_var.size)

# Format x and y-axes tick labels
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
ax.yaxis.set_major_formatter('{x:.1%}')

# Additional formatting
alpha = 0.3
ax.grid(axis='y', zorder=1, color='black', alpha=alpha)
for spine in ['top', 'right', 'left']:
    ax.spines[spine].set_visible(False)
ax.spines['bottom'].set_alpha(alpha)
ax.tick_params(axis='x', which='major', color=[0, 0, 0, alpha])
ax.tick_params(axis='y', which='major', length=0)
ax.set_title('Tweets sent per hour of day in UTC', fontsize=14, pad=20)
ax.set_ylabel('Relative frequency (% of total)', size=12, labelpad=10)

plt.show()

由于此直方图中的计数分布在24小时内,因此您可能会注意到,条形图的高度与您作为参考共享的图像中的直方图中的高度略有不同,在该图像中,计数似乎分为23个箱子,而不是24个箱子




参考资料:

您能给出几行数据框(数据)吗?此外,请检查您是否确实有日期。以下是df的前5行。0 RT@Transition46:我们团结一致。。。2020-11-08 14:28:23我发自内心地说:谢谢你。https:。。。2020-11-08 02:20:00 2一个国家团结起来。\n\n一个国家得到加强。\n\n。。。2020-11-08 02:10:00 3怀着饱满的心和坚定的手,带着信念。。。2020-11-08 02:08:00 4今晚,全世界都在关注美国。。。2020-11-08 02:05:00``当我输出df[“Time”]的前5条记录时,我得到以下结果。虽然我试图在plot_data.py的第14行将它们格式化为时间,但它们仍然显示日期和时间。02020-11-08 14:28:23 112020-11-08 02:20:002020-11-08 02:10:00 3200-11-08 02:08:00 4200-11-08 02:05:00谢谢您的帮助。已正确设置时间格式,例如
14:28:23、02:20:00、02:10:00
e.t.c.但是,现在我在尝试绘制这些时出错。我得到的错误是
TypeError:“数据集中是否缺少值?”?检查一下。如果是这样,在做任何其他事情之前先对他们进行治疗。看起来没有数据丢失。我已经将CSV转储到Google Sheets中,并将其作为网页发布,并且没有任何一行的任何一列缺少值。我暂时删除了除前10条记录以外的所有记录,并且在尝试绘制这些
TypeError:'时出现了相同的错误
df["Time"]= pd.to_datetime(data["Time"], format="%H:%M")
df['Time'] = pd.to_datetime(df['Time'],format= '%H:%M' ).dt.time
import numpy as np                 # v 1.19.2
import pandas as pd                # v 1.1.3
import matplotlib.pyplot as plt    # v 3.3.2
import matplotlib.dates as mdates

# Import data from html table into pandas dataframe
url = 'https://docs.google.com/spreadsheets/d/e/2PACX-1vTc97VEzlfDP_jEkjC7dTbJzcLBLDQeFwPMg6E36BaiH5qkhnedSz8wsVGUMyW6kt85rD20BcTMbvqp/pubhtml'
table, = pd.read_html(url, header=[1], index_col=1)
df = table.iloc[:, 1:]

# Save time variable as a pandas series of datetime dtype
time_var = pd.to_datetime(df['Time'], format='%H:%M:%S')

# Plot variable with pandas histogram function
ax = time_var.hist(bins=24, figsize=(10,5), grid=False, edgecolor='white', zorder=2,
                   weights=np.ones(time_var.size)/time_var.size)

# Format x and y-axes tick labels
ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
ax.yaxis.set_major_formatter('{x:.1%}')

# Additional formatting
alpha = 0.3
ax.grid(axis='y', zorder=1, color='black', alpha=alpha)
for spine in ['top', 'right', 'left']:
    ax.spines[spine].set_visible(False)
ax.spines['bottom'].set_alpha(alpha)
ax.tick_params(axis='x', which='major', color=[0, 0, 0, alpha])
ax.tick_params(axis='y', which='major', length=0)
ax.set_title('Tweets sent per hour of day in UTC', fontsize=14, pad=20)
ax.set_ylabel('Relative frequency (% of total)', size=12, labelpad=10)

plt.show()