<p>只是对Andrea的答案做了一点补充,只是解释一下我认为在您的原始代码中发生了什么。以下是具有分钟精度时间字符串和随机值的玩具数据:</p>
<pre><code>In[0]:
import pandas as pd
import numpy as np
import seaborn as sns
times = []
for h in range(24):
for m in range(60):
times.append('{0}:{1}:00'.format(f'{h:02}',f'{m:02}'))
values = np.random.rand(1440*3) #1400 minutes in a day
df = pd.DataFrame({'time':times*3,
'globalpower':values,})
df
Out[0]:
time globalpower
0 00:00:00 0.564812
1 00:01:00 0.429477
2 00:02:00 0.827994
3 00:03:00 0.525569
4 00:04:00 0.113478
... ...
7195 23:55:00 0.624546
7196 23:56:00 0.981141
7197 23:57:00 0.096928
7198 23:58:00 0.170131
7199 23:59:00 0.398853
[7200 rows x 2 columns]
</code></pre>
<p>请注意,我每次重复3x,以便<code>sns.lineplot</code>对每个唯一的时间进行平均。用代码绘制此数据会产生与您描述的相同的错误:</p>
<pre><code>graph = sns.lineplot(df.time, df.globalpower, data=df)
graph.set_xticks(range(0,24))
graph.set_xticklabels(['01:00','02:00','03:00','04:00','05:00','06:00','07:00','08:00','09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00','19:00','20:00','21:00','22:00','23:00','24:00'])
</code></pre>
<p><a href="https://i.stack.imgur.com/w3lcB.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/w3lcB.png" alt="enter image description here"/></a></p>
<p><strong>基本的差异在于打印函数和x轴参数都不知道有任何时间信息。当您使用<code>x=df.time</code>和<code>y=df.globalpower</code>调用<code>sns.lineplot</code>时,<code>seaborn</code>基本上对每个唯一条目的时间列执行groupby操作,并平均全局幂值<em>但在时间列</em>中只能看到唯一的字符串,这些唯一的字符串在绘制时会进行排序,这恰好与一天中的时间顺序相匹配,因为它们是以字母数字的方式书写的</p>
<P>参见此,考虑使用一个EMH>非时间格式化字符串<EEM >(例如‘0000’、‘0001’、‘0002’……’)<强>将导致同一图< /强>:</P>
<pre><code>names = []
for h in range(24):
for m in range(60):
names.append(str(f'{h:02}') + str(f'{m:02}'))
#names = ['0001','0002','0003',...]
df2 = pd.DataFrame({'name':names*3,
'globalpower':values,})
graph2 = sns.lineplot(df2.name, df2.globalpower, data=df)
graph2.set_xticks(range(0,24))
graph2.set_xticklabels(['01:00','02:00','03:00','04:00','05:00','06:00','07:00','08:00','09:00','10:00','11:00','12:00','13:00','14:00','15:00','16:00','17:00','18:00','19:00','20:00','21:00','22:00','23:00','24:00'])
</code></pre>
<p>因此,当您使用tick参数时,说<code>set_xticks(range(0,24))</code>和<code>set_xticklabels(['01:00','02:00','03:00'...])</code>基本上意味着“使用这24个标签在位置0到23处设置tick”,尽管绘图(在本例中)是1440个唯一的x值,因此0-23只跨越一小部分值</p>
<p>修复方法基本上就是Andrea所回答的:将您的时间信息转换成<code>datetime</code>格式,然后使用<code>matplotlib.dates</code>格式来设置节拍。对于您的时间字符串(无日期),您只需执行以下操作:</p>
<pre><code>df['time'] = pd.to_datetime(df['time'])
</code></pre>
<p>然后跟着他们的答案走。这将在1970年1月1日给每一次完整的时间戳(在<code>pandas</code>中是默认的);但是,如果你只关心为每个重复出现的时间绘制一个平均24小时的周期,那么奇怪的一年并不重要</p>