【问题标题】:Set numbers of x-ticks for a relplot in sns using Python使用 Python 为 sns 中的 relplot 设置 x-ticks 的数量
【发布时间】:2022-01-11 18:07:40
【问题描述】:

我们如何在 Python 中为 relplot 设置 x-ticks 的数量?我们的图表如下所示:

我们目前的图表包含 7 个月份中的日期,但我们希望将所有月份都包含为 x-ticks。我们想将 x-ticks 的数量设置为 12,并将以下内容作为 x 轴标签:

months = ['2020-01', '2020-02', '2020-03', '2020-04', '2020-05', '2020-06', '2020-07', '2020-08', '2020-09', '2020-10', '2020-11', '2020-12']

以下是生成图表的函数:

def create_lineplot(dataframe):

    months = mdates.MonthLocator()  # every month
    years_fmt = mdates.DateFormatter('%Y-%m')  # This is a format. Will be clear in Screenshot

    # Filtering data to only select relevant columns and data from the year 2020
    dataframe = dataframe[['dev_id', 'outside_temperature', 'datetime']]
    dataframe["datetime"] = pd.to_datetime(dataframe["datetime"])
    dataframe_2020 = dataframe[dataframe['datetime'].dt.year == 2020]

    fig, axes = plt.subplots(figsize=(20, 2))

    mdf = pd.melt(dataframe_2020, 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)
    g._legend.remove()

    axes.xaxis.set_major_locator(months)
    axes.xaxis.set_major_formatter(years_fmt)
    axes.xaxis.set_minor_locator(months)

    plt.xticks(rotation='vertical')
    plt.tight_layout()
    plt.legend(loc='upper left')

    plt.savefig('lineplot.png')

    plt.show()

我们的数据示例:

【问题讨论】:

  • Don't Post Data Screenshots。这个问题需要SSCCE。始终提供minimal reproducible example,其中包含代码、数据、错误、当前输出和预期输出,如formatted text。这个问题很可能会被否决并关闭。您不鼓励提供帮助,因为没有人愿意重新输入数据/代码,而且屏幕截图通常难以辨认。 edit 问题并添加文本。情节还行。见How to provide a reproducible dataframe
  • @JohanC 我正在使用 matplotlib 3.3.2 版和 pandas 1.1.4 版
  • 按照您最后的指示后,它确实有效!非常感谢您的时间和精力。由于答案是评论,我不能将其标记为正确答案

标签: python dataframe matplotlib seaborn


【解决方案1】:

代码的主要问题是在使用figure-level function 时创建了一个虚拟无花果和轴。因此,sns.relplot 创建了自己的图形和轴。您可以使用axes = g.axes.flat[0] 抓住它的第一把斧头。使用图形级函数时,应删除对fig, axes = plt.subplots(...) 的调用。

或者,您可以调用相关的轴级函数并传递 ax:sns.lineplot(..., ax=axes)

import matplotlib.pyplot as plt
from matplotlib import dates as mdates
import seaborn as sns
import pandas as pd
import numpy as np

dataframe = pd.DataFrame({'datetime': pd.date_range('20200101', periods=366, freq='D'),
                          'val1': np.random.normal(0.01, .2, 366).cumsum() + 20,
                          'val2': np.random.normal(0.03, .25, 366).cumsum() + 25})

months_locator = mdates.MonthLocator()  # every month
years_fmt = mdates.DateFormatter('%Y-%m')  # This is a format. Will be clear in Screenshot

dataframe["datetime"] = pd.to_datetime(dataframe["datetime"])
dataframe_2020 = dataframe[dataframe['datetime'].dt.year == 2020]

mdf = dataframe_2020.melt(id_vars=['datetime'], value_vars=['val1', 'val2'])

g = sns.relplot(data=mdf, x='datetime', y='value', hue='variable', kind='line', height=5, aspect=3)
g._legend.remove()
axes = g.axes.flat[0]

axes.xaxis.set_major_locator(months_locator)
axes.xaxis.set_major_formatter(years_fmt)

axes.legend(loc='upper left')
axes.tick_params(axis='x', rotation=90)
axes.margins(x=0)

plt.tight_layout()
plt.show()

【讨论】:

  • 你是对的!它有效,非常感谢你:)
猜你喜欢
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 2021-02-24
  • 2020-05-03
  • 2021-02-03
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多