【问题标题】:matplotlib xlabel displayed and set_xticklabels input mismatchedmatplotlib xlabel 显示和 set_xticklabels 输入不匹配
【发布时间】:2020-02-16 02:22:11
【问题描述】:

我有两个图表;一个在顶部,一个在底部。上图中除了 xaxis 标签之外的所有内容都是错误的,但在下图中,除了 xaxis 标签之外的所有内容都是正确的。所以很自然,人们会尽力用顶部图形的 xaxis 标签替换错误的 xaxis 标签,对吗?这就是我所做的,但由于某种原因,matplotlib 总是无法接受正确的 xaxis 标签,即使我几乎强制输入 xaxis 标签输入。

以下代码生成我提到的两个图表。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from datetime import datetime
np.random.seed(0)

x_var1= pd.date_range(datetime(2014, 1, 14, 9, 0),datetime(2014, 1, 24, 17, 0),
                   freq="30min",
                   tz= 'US/Pacific',
                   closed= 'left'
                   )

x_var1 = x_var1[x_var1.dayofweek < 5]
x_var1= x_var1[x_var1.indexer_between_time('9:00','17:00', include_end= False)]
x_var1= x_var1[x_var1.hour != 12]

y_var1= np.random.normal(loc= 40, scale= 4.4, size= len(x_var1))
int_gap_idx= np.nonzero((x_var1[:-1].hour!= 9) & (x_var1[1:].hour== 9))[0]


fig, ax= plt.subplots(nrows= 2, ncols= 1)

ax[0].plot(x_var1, y_var1)
ax[0].set_title("Except the xaxis label, everything is wrong on this graph")


x_var2= np.arange(len(x_var1))
ax[1].plot(x_var2, y_var1)
ax[1].set_title("Except the xaxis label, everything is correct on this graph")

[ax[1].axvline(gap_index, ls= '--') for gap_index in int_gap_idx]


#date_str= x_var1.strftime('%b-%d %H:%M')
ax[1].set_xticklabels(x_var1)
#print(date_str)

plt.xticks(rotation= 45)
plt.tight_layout()
plt.show()

剧情:

如您所见,底部图表仅显示 1 月 14 日的日期时间,即使数据介于 1 月 14 日和 1 月 24 日之间。

【问题讨论】:

  • ax[1].set_xticklabels([dt.strftime('%b-%d %H:%M') for dt in x_var1[::14]) ?

标签: python pandas datetime matplotlib time-series


【解决方案1】:

您的x_var1 的长度不正确,但您可以使用代码格式功能。确保

import matplotlib.ticker as ticker

然后在一个可以稍后传入的函数中使用它,这应该在缩放时保留轴配置

N = len(x_var1)
def format_date(x, pos=None):
    thisind = np.clip(int(x + 0.5), 0, N - 1)
    return x_var1[thisind].strftime('%b-%d %H:%M')

ax[1].xaxis.set_major_formatter(ticker.FuncFormatter(format_date))

【讨论】:

  • 它运行良好,直到我放大图表,然后 xaxis 中的所有内容都未对齐。
  • 看看这里,不幸的是它不是那么简单。你真的需要缩放吗? stackoverflow.com/questions/43234435/…
  • 感谢您的链接。至于是否需要缩放,是的,我的数据集足够大,需要进行一些缩放。
  • 其实我用x_var2= x_var1.strftime('%b-%d %H:%M')生成底部图已经部分解决了这个问题,但是这个解决方案又产生了一个问题; xaxis 刻度密度太高了,所以我需要降低它的密度。
  • @mathguy 我认为上面编辑的解决方案应该可以工作
猜你喜欢
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多