gpt4 book ai didi

python - matplotlib - 调用axes.cla()后,autofmt_xdate()无法旋转x轴标签

转载 作者:太空宇宙 更新时间:2023-11-03 14:18:50 26 4
gpt4 key购买 nike

我有两组数据需要根据时间绘制。我需要单独显示它们,并借助单选按钮(或类似的方式)一起显示它们。单选按钮代码基于 https://stackoverflow.com/a/6697555/3910296

在加载第一组数据之前,一切看起来都很好。每当要绘制下一组数据时,我都会清除轴并重新绘制数据。但是当我单击单选按钮中的下一项时,会显示新数据,但 x 轴不会旋转。有什么办法可以解决这个问题吗?

重现我面临的问题的示例代码

import datetime
import matplotlib.pyplot as plt
from matplotlib.widgets import RadioButtons
import matplotlib.dates as mdates

data0_usage = [45, 76, 20, 86, 79, 95, 14, 94, 59, 84]
data1_usage = [57, 79, 25, 28, 17, 46, 29, 52, 68, 92]
data0_timestamp = []


def draw_data_plot(ax, data_no):
if data_no == 0:
data_usage = data0_usage
data_color = 'go'
elif data_no == 1:
data_usage = data1_usage
data_color = 'ro'

ax.plot_date(data0_timestamp, data_usage, data_color)
ax.plot_date(data0_timestamp, data_usage, 'k', markersize=1)


def draw_plot():
fig = plt.figure()
ax = fig.add_subplot(111)
ax.grid(True)

# Adjust the subplots region to leave some space for the sliders and buttons
fig.subplots_adjust(left=0.25, bottom=0.25)

# Beautify the dates on x axis
time_format = mdates.DateFormatter('%Y-%b-%d %H:%M:%S')
plt.gca().xaxis.set_major_formatter(time_format)
plt.gcf().autofmt_xdate()

# Draw data0 plot
draw_data_plot(ax, 0)

# Add a set of radio buttons for changing color
color_radios_ax = fig.add_axes(
[0.025, 0.5, 0.15, 0.15], axisbg='lightgoldenrodyellow')
color_radios = RadioButtons(
color_radios_ax, ('data 0', 'data 1', 'all'),
active=0)

def color_radios_on_clicked(label):
ax.cla()
ax.grid(True)
if label == 'all':
draw_data_plot(ax, 0)
draw_data_plot(ax, 1)
else:
draw_data_plot(ax, int(label[5]))

ax.xaxis.set_major_formatter(time_format)
plt.gcf().autofmt_xdate()
fig.canvas.draw_idle()

color_radios.on_clicked(color_radios_on_clicked)
plt.show()


current_date = datetime.datetime.today()
for days in range(0, 10):
data0_timestamp.append(current_date + datetime.timedelta(days))
draw_plot()

使用 Windows 10、Python 2.7.32、matplotlib 2.1.0

最佳答案

问题

原因plt.gcf().autofmt_xdate()坐标区内容的后续更新失败的原因是,在调用它时,图形内有坐标区,它们不是子图。这是 fig.add_axes 创建的轴,是单选按钮轴。 autofmt_xdate将不知道如何处理该轴,即它不知道这是否是旋转标签的轴,因此它将决定不执行任何操作。在 matplotlib source code这看起来像

allsubplots = all(hasattr(ax, 'is_last_row') for ax in self.axes)
if len(self.axes) == 1:
# rotate labels
else:
if allsubplots:
for ax in self.get_axes():
if ax.is_last_row():
#rotate labels
else:
#set labels invisible

因为你有一个轴,它不是子图,allsubplots == False并且不会发生旋转。

解决方案

解决方案是不使用 autofmt_xdate() ,但是手动旋转刻度标签的工作 - 这实际上只有 3 行代码。替换行 plt.gcf().autofmt_xdate()通过

for label in ax.get_xticklabels():
label.set_ha("right")
label.set_rotation(30)

关于python - matplotlib - 调用axes.cla()后,autofmt_xdate()无法旋转x轴标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48078540/

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