是否可以使用 matplotlib 将 x 轴设置为仅显示开始日期和结束日期?

Posted

技术标签:

【中文标题】是否可以使用 matplotlib 将 x 轴设置为仅显示开始日期和结束日期?【英文标题】:Is it possible to set the xaxis to show only start date and end date with matplotlib? 【发布时间】:2020-03-17 20:49:17 【问题描述】:

我正在使用 pandas 数据框中的 python3 和 matplotlib 进行绘图。我的数据框如下所示:

    date      | value1 | value2 | price
 --------------------------------------
   2019-09-01 |  300   |   125  | 850
   2019-09-02 |  400   |   250  | 625
       .      |   .    |    .   |  .
       .      |   .    |    .   |  .
       .      |   .    |    .   |  .
   2019-11-14 |  216   |   543  | 793

date 是一个日期时间对象,value1、value2 和 price 都只是整数/浮点数。 我将 value1,value2 绘制为堆积条形图,将价格绘制为同一图上两个轴上的一条线,使用第二个轴显示 xticks (注意,stacked_bar 是由df 和 price 是堆积条形图中日期的相应价格。我的代码 ex 在我的绘图函数中实际显示这一点很简短,因为这些不是问题,所以只是想了解我正在使用什么):

fig,ax = plt.subplots(nrows=2)
fig.set_size_inches(10,6)
stacked_bar.plot(kind='bar',stacked=True,ax=ax[0])
df['Price'].plot(ax=ax[1])

有没有一种简单的方法可以让 matplotlib 在此处将结束日期显示为 xtick ? 我已经尝试了一百万种方法来正确格式化刻度,但我似乎无法做到得到正确的。我正要让 x 轴不可见并将日期范围显示为像“9-01 到 11-14”这样的标签。作为参考,在显示的图中,我没有对 xticks 进行任何调整,这是它在运行时的显示方式。

【问题讨论】:

这是一个 matplotlib 问题,但如果您提供一个最小的工作示例(包括可加载的数据子集),您将获得更多响应。基本思想是在底轴上同时设置 xticks 和 xticklabel。如果没有您的实际数据,我不清楚的是“日期”是字符串还是日期时间。 你能提供你尝试过的代码吗? 【参考方案1】:

在以下示例中,日期设置为用于生成第一个和最后一个刻度标签的索引:

import numpy as np               # v 1.19.2
import pandas as pd              # v 1.2.3
import matplotlib.pyplot as plt  # v 3.3.4

# Create sample dataset
rng = np.random.default_rng(seed=1)
date = pd.date_range('2019-09-01', '2019-11-14', freq='D')
value1 = rng.integers(0, 2000, size=date.size)
value2 = rng.integers(0, 2000, size=date.size)
price = 800 + np.cumsum(rng.integers(-100, 101, size=date.size))
df = pd.DataFrame(dict(value1=value1, value2=value2, Price=price), index=date)

# Create plots with shared x-axis and use_index=False to align them properly
fig, (top, bot) = plt.subplots(nrows=2, sharex=True, figsize=(10,6))
df[['value1', 'value2']].plot(kind='bar', stacked=True, ax=top)
df['Price'].plot(use_index=False, ax=bot)

# Format x-axis ticks
top.xaxis.set_visible(False)
bot.set_xticks([0, len(df)-1])
bot.set_xticks([], minor=True)
bot.set_xticklabels([date.strftime('%m-%d') for date in df.index[[0,-1]]]);

【讨论】:

以上是关于是否可以使用 matplotlib 将 x 轴设置为仅显示开始日期和结束日期?的主要内容,如果未能解决你的问题,请参考以下文章

python使用matplotlib可视化为X轴设置轴标签位置及其对应的标签文本(set label locations and corresponding labels in matplotlib

Matplotlib绘图时x轴标签重叠的解决办法

python使用matplotlib可视化为可视化图像的X轴和Y轴设置自定义的轴标签(axis labels of matplotlib plot)

python使用matplotlib可视化自定义设置X轴刻度标签字体的大小( setting axis ticks size in matplotlib x axis)

matplotlib之xticks()函数设置X轴方法--刻度、标签

matplotlib 笔记:设置x轴 y轴文字