pandas Matplotlib xaxis在空日期上带有刻度

suzh9iv8  于 2023-08-01  发布在  其他
关注(0)|答案(1)|浏览(96)

我想显示一个没有内置plot函数的pandas DataFrame,并且很难只得到x轴上DataFrame的日期。Matplotlib本身会显示空的箱子/日期,我希望避免这些。
范例:

import matplotlib.pyplot as plt
import pandas as pd
dates = [pd.to_datetime(x) for x in ['2023-07-27', '2023-07-28', '2023-07-31']]
data = pd.DataFrame([3,2,4], index=dates, columns=['val'])

fig, ax = plt.subplots()
data.plot(kind='bar', ax=ax)
labels = [item.get_text()[:10] for item in ax.get_xticklabels()]
ax.set_xticklabels(labels)
plt.show()

字符串
这给出了下图:x1c 0d1x的数据
尝试复制这个没有pandas图的图看起来像这样,但图中有多个空刻度。

fig, ax = plt.subplots()
ax.set_xticks(data.index)
ax.set_xticklabels(data.index.strftime("%Y-%m-%d"))
ax.bar(data.index, data.val)
plt.xticks(rotation=90)
plt.show()



如何在matplotlib中不绘制空箱?上面的set_xticks方法没有按预期工作。如果你注解掉ax.set_xtick*,你也会得到中间的标记。
编辑:可能会有其他 Dataframe 与其他日期一起绘制在同一图形中。上面的例子只是展示了差距,我希望有一个方法告诉matplotlib不要显示所有的空箱,理想情况下独立于输入数据集。Matplotlib有所有的信息,它应该能够删除空的箱子。

#additional example
data2 = pd.DataFrame([1,3], index=[pd.to_datetime(x) for x in ['2023-08-01', '2023-08-02']], columns=['val2'])
fig, ax = plt.subplots()
ax.bar(data.index, data.val)
ax.bar(data2.index, data2.val2)
### add something here to delete empty bins
plt.xticks(rotation=90)
plt.show()


如果调用ax.xaxis.get_majorticklocs(),你会看到它在没有记录数据点的位置上创建了主要的刻度。正如一条评论中所说,我相信这是由于日期-> 1970年后的整数天数的转换。因此,我希望有一个选项来告诉matplotlib忽略空的箱子,或者一个函数来手动删除它们。

7lrncoxx

7lrncoxx1#

一个简单的选项是不使用日期作为xtick位置,例如:

fig, ax = plt.subplots()
ax.set_xticks(range(len(data)))  # just set ticks to [0, 1, 2]
ax.set_xticklabels(data.index.strftime("%Y-%m-%d"))
ax.bar(range(len(data)), data.val)
plt.xticks(rotation=90)
plt.show()

字符串

相关问题