如何将时间用作带有seaborn的散点图的x轴?

Posted

技术标签:

【中文标题】如何将时间用作带有seaborn的散点图的x轴?【英文标题】:How to use time as x axis for a scatterplot with seaborn? 【发布时间】:2020-04-10 22:04:34 【问题描述】:

我有一个简单的数据框,以时间为索引,以虚拟值为例。[] 我做了一个简单的散点图,你在这里看到:

简单的问题:如何调整xaxis,使xaxis中从00:00到23:00的所有时间值都可见?该图的其余部分很好,它显示了所有数据点,它只是标签。尝试了不同的方法,但没有成功。

到目前为止我所有的代码都是:

import pandas as pd
import seaborn as sns
import matplotlib.dates as mdates
from datetime import time

data = []
for i in range(0, 24):
    temp_list = []
    temp_list.append(time(i))
    temp_list.append(i)
    data.append(temp_list)

my_df = pd.DataFrame(data, columns=["time", "values"])    
my_df.set_index(['time'],inplace=True)
my_df
fig = sns.scatterplot(my_df.index, my_df['values'])
fig.set(xlabel='time', ylabel='values')

【问题讨论】:

【参考方案1】:

我认为您将不得不为此降低到 matplotlib 级别:

import pandas as pd
import seaborn as sns
import matplotlib.dates as mdates
from datetime import time
import matplotlib.pyplot as plt

data = []
for i in range(0, 24):
    temp_list = []
    temp_list.append(time(i))
    temp_list.append(i)
    data.append(temp_list)

df = pd.DataFrame(data, columns=["time", "values"])  
df.time = pd.to_datetime(df.time, format='%H:%M:%S')
df.set_index(['time'],inplace=True)
ax = sns.scatterplot(df.index, df["values"])
ax.set(xlabel="time", ylabel="measured values")
ax.set_xlim(df.index[0], df.index[-1])
ax.xaxis.set_major_locator(mdates.HourLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter("%H:%M:%S"))
ax.tick_params(axis="x", rotation=45)

这会产生

【讨论】:

这不起作用。除了写“时间”之外,它在 x 轴上没有显示任何东西 它对我有用。如果您发布 MCVE,我们可以为您提供更多帮助 ***.com/help/minimal-reproducible-example 嘿,我编辑了我的问题。带有完整的代码。感谢您的帮助 @juuubbb 谢谢!好的,我现在看到了问题 - 您需要将 df.time 格式化为日期时间(否则 mdates.HourLocator() 不知道如何处理它)。已更新我的答案【参考方案2】:

我认为你有两个选择:

    仅将时间转换为小时,因为只需将小时提取到 df 中的新列

df['hour_'] = datetime.hour

而不是将它用作您的 xaxis

    如果您需要您描述的格式的时间,它可能会导致您出现可见性问题,其中时间戳将相互重叠。我正在使用

plt.xticks(rotation=45, Horizo​​ntalalignment='right')

ax.xaxis.set_major_locator(plt.MaxNLocator(12))

所以首先我旋转文本然后我限制刻度数。

这是我使用它的完整脚本:

sns.set()
sns.set_style("whitegrid")
sns.axes_style("whitegrid")

for k, g in df_forPlots.groupby('your_column'):
    fig = plt.figure(figsize=(10,5))
    wide_df = g[['x', 'y', 'z']]
    wide_df.set_index(['x'], inplace=True)
    ax = sns.lineplot(data=wide_df)
    plt.xticks(rotation=45,
                   horizontalalignment='right')
    ax.yaxis.set_major_locator(plt.MaxNLocator(14))
    ax.xaxis.set_major_locator(plt.MaxNLocator(35))
    plt.title(f"your k in somthingg.z.unique()")
    plt.tight_layout()

希望我停下来

【讨论】:

以上是关于如何将时间用作带有seaborn的散点图的x轴?的主要内容,如果未能解决你的问题,请参考以下文章

将 Matplotlib/Seaborn 散点图变形为平行四边形

如何获得一个散点矩阵,仅由具有 1:1 线的散点图和良好的轴标签组成?

如何动画散点图

根据 Seaborn 中的散点图绘制热图

使用 Seaborn 抛光散点图图例

seaborn可视化散点图并自定义数据轴标签指定标签文本的大小(X轴和Y轴的轴标签,Change X & Y Axis Label Size in a Seaborn Plot)