gpt4 book ai didi

python - 降低 seaborn 线图上日期的 x 轴值密度

转载 作者:行者123 更新时间:2023-12-04 02:32:41 30 4
gpt4 key购买 nike

对 Python 和一般编程来说还很陌生,所以请耐心等待。我有一个从 .csv 文件导入的数据集,我试图在 1 年内按日期(x 轴)绘制一列值(y 轴),但问题是日期太密集,我我一生都无法弄清楚如何将它们隔开或修改它们的定义方式。这是我正在使用的代码:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib as mpl
from scipy import stats
import cartopy.crs as ccrs
import cartopy.io.img_tiles as cimgt

df = pd.read_csv('Vanuatu Earthquakes 2018-2019.csv')
这是线图代码:
plt.figure(figsize=(15, 7))
ax = sns.lineplot(x='date', y='mag', data=df).set_title("Earthquake magnitude May 2018-2019")

plt.xlabel('Date')
plt.ylabel('Magnitude (Mw)')
plt.savefig('EQ mag time')
这目前给了我这个线图:
1
目前,我想通过每天的小勾号和每周开始的更大的勾号 + 标签来做到这一点。不必完全如此,但我主要是希望降低密度。我在这里查看了大量帖子,但它们似乎都不适用于我的情况,因此将不胜感激。
[更新]
按照下面 Konqui 的建议获取日期,我的代码现在如下所示:
time = pd.date_range(start = '01-05-2018',
end = '01-05-2019',
freq = 'D')
df = pd.DataFrame({'date': list(map(lambda x: str(x), time)),
'mag': np.random.random(len(time))})

plt.figure(figsize=(15, 7))
df['date'] = pd.to_datetime(df['date'], format = '%Y-%m')
ax = sns.lineplot(x='date', y='mag', data=df).set_title("Earthquake magnitude May 2018-2019")
ax.xaxis.set_major_locator(md.WeekdayLocator(byweekday = 1))
ax.xaxis.set_major_formatter(md.DateFormatter('%Y-%m-%d'))
plt.setp(ax.xaxis.get_majorticklabels(), rotation = 90)
ax.xaxis.set_minor_locator(md.DayLocator(interval = 1))
plt.xlabel('Date')
plt.ylabel('Magnitude (Mw)')
这给了我一条错误消息: AttributeError: 'Text' object has no attribute 'xaxis' .有什么想法吗?

最佳答案

假设
我想你从一个类似于保存在 Vanuatu Earthquakes 2018-2019.csv 中的数据帧开始文件 :

import pandas as pd
import numpy as np

time = pd.date_range(start = '01-01-2020',
end = '31-03-2020',
freq = 'D')
df = pd.DataFrame({'date': list(map(lambda x: str(x), time)),
'mag': np.random.random(len(time))})
输出:
                  date       mag
0 2020-01-01 00:00:00 0.940040
1 2020-01-02 00:00:00 0.765570
2 2020-01-03 00:00:00 0.951839
3 2020-01-04 00:00:00 0.708172
4 2020-01-05 00:00:00 0.705032
5 2020-01-06 00:00:00 0.857500
6 2020-01-07 00:00:00 0.866418
7 2020-01-08 00:00:00 0.363287
8 2020-01-09 00:00:00 0.289615
9 2020-01-10 00:00:00 0.741499
绘图:
import seaborn as sns
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize = (15, 7))

sns.lineplot(ax = ax, x='date', y='mag', data=df).set_title('Earthquake magnitude May 2018-2019')

plt.xlabel('Date')
plt.ylabel('Magnitude (Mw)')

plt.show()
enter image description here

回答
你应该做一系列的事情:
  • 首先,你得到标签的密度是因为你的 'date'值为 str类型,您需要将它们转换为 datetime经过
    df['date'] = pd.to_datetime(df['date'], format = '%Y-%m-%d')
    这样你的 x 轴是一个 datetime键入,上面的情节将变成这样:

  • enter image description here
  • 然后你必须调整刻度;对于您应该设置的主要刻度:
    import matplotlib.dates as md

    # specify the position of the major ticks at the beginning of the week
    ax.xaxis.set_major_locator(md.WeekdayLocator(byweekday = 1))
    # specify the format of the labels as 'year-month-day'
    ax.xaxis.set_major_formatter(md.DateFormatter('%Y-%m-%d'))
    # (optional) rotate by 90° the labels in order to improve their spacing
    plt.setp(ax.xaxis.get_majorticklabels(), rotation = 90)
    和小蜱:
    # specify the position of the minor ticks at each day
    ax.xaxis.set_minor_locator(md.DayLocator(interval = 1))
    或者,您可以使用以下方法编辑刻度线的长度:
    ax.tick_params(axis = 'x', which = 'major', length = 10)
    ax.tick_params(axis = 'x', which = 'minor', length = 5)
    所以最终的情节将变成:

  • enter image description here

    完整代码
    # import required packages
    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    import matplotlib.dates as md

    # read the dataframe
    df = pd.read_csv('Vanuatu Earthquakes 2018-2019.csv')
    # convert 'date' column type from str to datetime
    df['date'] = pd.to_datetime(df['date'], format = '%Y-%m-%d')

    # prepare the figure
    fig, ax = plt.subplots(figsize = (15, 7))

    # set up the plot
    sns.lineplot(ax = ax, x='date', y='mag', data=df).set_title('Earthquake magnitude May 2018-2019')

    # specify the position of the major ticks at the beginning of the week
    ax.xaxis.set_major_locator(md.WeekdayLocator(byweekday = 1))
    # specify the format of the labels as 'year-month-day'
    ax.xaxis.set_major_formatter(md.DateFormatter('%Y-%m-%d'))
    # (optional) rotate by 90° the labels in order to improve their spacing
    plt.setp(ax.xaxis.get_majorticklabels(), rotation = 90)

    # specify the position of the minor ticks at each day
    ax.xaxis.set_minor_locator(md.DayLocator(interval = 1))

    # set ticks length
    ax.tick_params(axis = 'x', which = 'major', length = 10)
    ax.tick_params(axis = 'x', which = 'minor', length = 5)

    # set axes labels
    plt.xlabel('Date')
    plt.ylabel('Magnitude (Mw)')

    # show the plot
    plt.show()

    笔记
    如果您注意我图中的 y 轴,您会看到 'mag'值落在 (0-1) 范围内.这是因为我使用 'mag': np.random.random(len(time)) 生成了这些假数据。 .如果您阅读 您的 文件中的数据 Vanuatu Earthquakes 2018-2019.csv ,您将在 y 轴上获得正确的值。尝试简单地复制 中的代码完整代码部分。

    关于python - 降低 seaborn 线图上日期的 x 轴值密度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63218645/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com