下面显示了一张模拟数据图,其中包含我想要修改的 xticks。 默认情况下,pd.df.plot 选择相隔大约 3 个月的日期作为刻度。 但我想要的是每个月都是一个滴答声。 做这个的最好方式是什么? 季节性蜱虫呢? 先感谢您。

在此处输入图片说明

#1楼 票数:22 已采纳

首先,您必须将 Pandas 日期对象转换为 Python 日期对象。 由于 matplotlib 内部日期转换函数,因此需要此转换。 然后使用matplotlib.dates函数来设置所需的格式化程序和刻度位置,如下所示:

import pandas as pd
import numpy as np
import matplotlib.pylab as plt
import matplotlib.dates as mdates

# convert date objects from pandas format to python datetime
index = pd.date_range(start = "2015-07-01", end = "2017-01-01", freq = "D")
index = [pd.to_datetime(date, format='%Y-%m-%d').date() for date in index]
data = np.random.randint(1,100, size=len(index))
df = pd.DataFrame(data=data,index=index, columns=['data'])
print (df.head())

ax = df.plot()
# set monthly locator
ax.xaxis.set_major_locator(mdates.MonthLocator(interval=1))
# set formatter
ax.xaxis.set_major_formatter(mdates.DateFormatter('%d-%m-%Y'))
# set font and rotation for date tick labels
plt.gcf().autofmt_xdate()

plt.show()

对于季节标签,您必须自己构建它,然后使用plt.setp函数进行设置(对于 02 月设置标签winter ,04 - spring等): plt.setp(new_labels, rotation=90, fontsize=9)

在此处输入图片说明

df负责人:

            data
2015-07-01    26
2015-07-02    33
2015-07-03    46
2015-07-04    69
2015-07-05    17

#2楼 票数:10

我很难让@Serenity 回答工作,因为我直接使用 Matplotlib 而不是绘制 Pandas 数据集。 因此,如果您是其中之一,我的回答可能会有所帮助。

使用 Matplotlib.plot() 绘图

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# Process dataset
bitcoin['Date'] = pd.to_datetime(bitcoin['Date'])
bitcoin['Open'] = pd.to_numeric(bitcoin['Open'])

# Plot
plt.figure()
plt.plot(bitcoin['Date'], bitcoin['Open'])
ax = plt.gca()
ax.xaxis.set_major_locator(mdates.MonthLocator(interval=4))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%d-%m-%Y'))
plt.gcf().autofmt_xdate() # Rotation
plt.show()
bitcoin[['Date', 'Open']].head()

    Date        Open
0   2017-09-05  4228.29
1   2017-09-04  4591.63
2   2017-09-03  4585.27
3   2017-09-02  4901.42
4   2017-09-01  4701.76

比特币价格图表

#3楼 票数:2

这个答案基于Serenity 的一个以及ImportanceOfBeingErnest 的这个

自定义时间序列刻度标签的最佳方法是使用matplotlib.dates模块 (mdates) 中的刻度定位器和格式化程序。 尽管值得注意的是,如果您想要一个基于与您正在绘制的时间序列相同的单位的刻度频率,使用日期作为字符串创建和格式化刻度标签可能更方便,就像在这个问题的答案中一样熊猫条形图

文档中所述,pandas 使用 matplotlib 为时间序列创建带有自己的自定义刻度格式器的图:

pandas 为时间序列图提供自定义格式化程序。 这些更改了日期和时间轴标签的格式。 默认情况下,自定义格式化程序仅应用于由 Pandas 使用 DataFrame.plot() 或 Series.plot() 创建的绘图。

pandas 时间序列图的刻度和标签目前默认格式如下:

import numpy as np                   # v 1.19.2
import pandas as pd                  # v 1.1.3
import matplotlib.dates as mdates     # v 3.3.2

# Create random dataset stored as a pandas DataFrame with a DatetimeIndex
rng = np.random.default_rng(seed=1) # random number generator
date_day = pd.date_range(start='2015-07-01', end='2016-12-31', freq='D')
traffic = rng.lognormal(sigma=2, size=date_day.size)
df_day = pd.DataFrame(dict(traffic=traffic), index=date_day)

# Create pandas plot with default settings except for figure size
df_day.plot(figsize=(10,5));

pd_default_plot

为了能够使用 mdates 刻度定位器和格式化程序并覆盖默认刻度格式,matplotlib 必须正确识别熊猫日期。 问题在于,pandas 和 matplotlib 有不同的方法来计算用于在时间轴(默认为 x 轴)上定位刻度的日期数字。

在 pandas 中,时间以纳秒为单位,从1970-01-01 00:00:00 (Unix 纪元的起源)的零开始,并且各个时间点存储为pandas 时间戳对象 但是在为绘图创建时间尺度时,pandas 使用另一种编号系统,该系统从同一原点开始,然后在所选频率的每个周期内增加 1(在本例中,频率以天为单位)。

自 2020 年 7 月发布的 3.3.0 版以来, Matplotlib 使用与 pandas 相同的默认来源,但日期始终以天为单位进行编号

Matplotlib 使用浮点数表示日期,指定自 1970-01-01 UTC 的默认纪元以来的天数; 例如,1970-01-01, 06:00 是浮点数 0.25。

您可以通过运行ax.get_xticks()ax = df.plot()来检查用于比例尺的数字。

正如您可能已经猜到的那样,这意味着当时间序列的频率为天时,不需要日期转换,如下图所示,使用简单的自定义刻度定位器和格式化程序:

ax = df_day.plot(figsize=(10,5))

# Create custom ticks using matplotlib date tick locator and formatter
loc = mdates.MonthLocator(interval=2)
ax.xaxis.set_major_locator(loc)
fmt = mdates.DateFormatter('%b\n%Y')
ax.xaxis.set_major_formatter(fmt)

pd_tsdays_customticks

这种特殊情况可以方便地为 x 轴限制和次要 x 刻度保留其他 Pandas 默认设置。 但这是一般规则的一个例外。

为了能够将 mdates 刻度定位器和格式化程序与任何类型频率的时间序列的熊猫图一起使用,您需要使用( 长期存在不存在文档字符串几乎没有记录x_compat=True参数. 以下示例说明了它与按月频率重新采样的相同数据集的用法。 通常情况下,您只想稍微调整默认的 Pandas 格式,因此在以下示例中,从头开始重新创建默认格式以显示可以使用哪些方法对其进行调整:

# Resample time series to monthly frequency and plot it using date
# numbers that are compatible with mdates
df_month = df_day.resample('MS').sum()
ax = df_month.plot(figsize=(10,5), x_compat=True)

# Set major and minor date tick locators
maj_loc = mdates.MonthLocator(bymonth=np.arange(1,12,2))
ax.xaxis.set_major_locator(maj_loc)
min_loc = mdates.MonthLocator()
ax.xaxis.set_minor_locator(min_loc)

# Set major date tick formatter
zfmts = ['', '%b\n%Y', '%b', '%b-%d', '%H:%M', '%H:%M']
maj_fmt = mdates.ConciseDateFormatter(maj_loc, zero_formats=zfmts, show_offset=False)
ax.xaxis.set_major_formatter(maj_fmt)

ax.figure.autofmt_xdate(rotation=0, ha='center')
ax.set_xlim(df_month.index.min(), df_month.index.max());

pandas_tsmonths_customticks


文档: pd.date_range日期格式代码mdates.ConciseDateFormatterfig.autofmt_xdate

  ask by MLhacker translate from so

未解决问题?本站智能推荐:

1回复

使用matplotlib更改python条形图中日期时间数据的x轴刻度标签的频率

我有一个脚本,可以接收多个.csv文件并输出多个条形图。 数据为每日降雨量总计,因此x轴为日期格式为%d %m %Y 。 照原样,该代码尝试将所有365天都包含在标签中,但x轴被塞住了。 例如,我可以使用什么代码来每月仅包含一个标签,格式为“ Jan 01”。 这是我先前问题的扩展
1回复

Matplotlib x 轴日期刻度频率

我有一个简单的数据框,看起来像这样(Year 是日期时间索引列): 我使用以下方法绘制数据: df['A'].plot() df['B'].plot() 并每 5 年获取一次带有日期刻度标签的图表。 如何让年份刻度每 2 年(或任何其他数字)出现一次?
1回复

Matplotlib:季度次要刻度标签

我有要使用Matplotlib绘制的季度数据。 我希望主要的xtick标签显示年份,次要的xtick标签显示季度。 但是,我所能找到的只是月度数据。 也就是说,以下代码(使用matplotlib的mdates函数)将每月使次要ticks,但我看不到季度选择... 有什么帮助吗?
1回复

matplotlib上的X轴日期时间标签争执

我有一个带有DateTime索引的pandas DataFrame。 我可以从中绘制一个时间序列,默认情况下看起来还不错。 但是,当我尝试从同一DataFrame打印条形图时,xAxis标签被破坏了(大量重叠)。 (数据的间隔也很奇怪(条形图之间的间隙很大) 我尝试了auto
1回复

使用 matplotlib 在 python 中的盒须图与日期时间

我有以下数据: 我想要做的是使用最小值、Q1、中值、Q3 和最大值与 x 轴中的日期时间在 y 轴上绘制盒须图。 鉴于值的范围,我正在考虑在 y 轴上使用 'symlog'。 但是,我无法让箱线图与日期时间(使用 matplotlib)进行对比。 我一直在尝试使用补丁中的矩形,但这比我想象的要棘
2回复

更改 matplotlib 中日期时间轴的格式

我有一个系列,其索引是我希望绘制的datetime 。 我想在 y 轴上绘制系列的值,在 x 轴上绘制系列的索引。 该Series如下所示: 我使用plt.plot(series.index, series.values)生成图表。 但图形看起来像: 问题是我只想有年和月(yyyy-mm
2回复

我找不到将熊猫时间戳转换为 matplotlib 图的日期的方法

过去几天我一直在尝试无数次,但似乎找不到解决方案。 这是我当前的代码和一些评论: 这是输出: 如您所见,它显示的日期如下: 2019-11-04 00:00:00 我的目标是显示这样的日期: 我已经尽可能多地清理了代码,使其更易于阅读和理解。
1回复

将使用第二个轴的线图添加到使用自定义日期作为 x 刻度 matplotlib 的条形图

我有一个像这样生成的堆积条形图: 在这种情况下,实际数据并不重要,重要的是为 x 轴提供的日期。 如您所见,日期是从 7 月 1 日到 7 月 22 日,并且是完全连接的,并且该图显示了我想要的内容。 但是,现在我尝试在第二个轴上添加一个线图,如下所示: 如您所见,deltas 和 de