Python中Seaborn(sns)如何手动设置x轴刻度并指定起始值
Python Seaborn手动设置x轴刻度解决方案
你之前直接调用g.set_xticklabels()的方法存在两个核心问题:
- 该方法仅替换现有刻度的文本标签,不会修改x轴的实际数值范围,会将原本从2020-02开始的刻度硬套上2020-01的标签,导致数据整体左移,看起来2020-01也有数据
- 你代码中单独创建的
fig, axes = plt.subplots()对象不会作用到Seaborn绘图上:sns.relplot是Figure级别的接口,会自动创建独立的画布,你对axes的刻度设置完全不会生效,这也是刻度对齐异常的原因
正确修改方案
直接调整x轴的数值范围,再对Seaborn返回的FacetGrid自带的坐标轴做刻度设置即可,修改后的代码如下:
def create_lineplot(dataframe): months = mdates.MonthLocator() # 每一个月显示一个刻度 years_fmt = mdates.DateFormatter('%Y-%m') # 日期显示格式 # 过滤数据,仅保留2020年的记录和需要的字段 dataframe = dataframe[['dev_id', 'temp_20', 'temp_60', 'datetime']] dataframe["datetime"] = pd.to_datetime(dataframe["datetime"]) soil = dataframe[dataframe['datetime'].dt.year == 2020] # 删掉原本没用的fig, axes = plt.subplots(figsize=(20, 2))代码 mdf = pd.melt(soil, id_vars=['datetime', 'dev_id'], var_name=['Temperature']) g = sns.relplot(data=mdf, x='datetime', y='value', kind='line', hue='Temperature', height=5, aspect=3) # --------------------插入的正确代码开始-------------------- # 手动设置x轴范围,左边界扩展到2020-01-01,右边界到2020-12-31,空出2020-01的空白区域 g.ax.set_xlim(pd.to_datetime('2020-01-01'), pd.to_datetime('2020-12-31')) # 对Seaborn实际绘图的坐标轴做刻度设置,保证生效 g.ax.xaxis.set_major_locator(months) g.ax.xaxis.set_major_formatter(years_fmt) g.ax.xaxis.set_minor_locator(months) # --------------------插入的正确代码结束-------------------- g._legend.remove() plt.xticks(rotation='vertical') plt.tight_layout() plt.legend(loc='upper right') plt.savefig('lineplot.png') plt.show()
额外疑问解答:刻度对齐
上述代码直接对Seaborn绘图的实际坐标轴g.ax进行刻度设置,配合MonthLocator会自动将刻度对齐到每个月的起始位置,不需要手动写死刻度标签,也不会出现刻度偏移的问题。
内容的提问来源于stack exchange,提问作者Buster3650
相关产品推荐
相关产品推荐

