gpt4 book ai didi

python - 获取默认的 x 刻度标签文本用作索引,以使用其他文本更新刻度标签

转载 作者:行者123 更新时间:2023-12-01 02:27:23 25 4
gpt4 key购买 nike

我的意图:绘制一些内容,获取与默认 x-tick 标签相对应的数字,并使用它们来索引日期列表,以便我可以将这些日期放在默认标签的位置。

假设我有两个列表:

my_data = range(30)
dates_ls = ['date_str1', 'date_str2', ... , 'date_str30']

我想绘制这些数据,然后用 dates_ls 中的适当日期替换 x-ticks,这意味着用默认 x- 中的数字索引 dates_ls勾选标签。

编辑:所以,问题似乎是由于我处于 for 循环中而造成的:

dates_ls = ['dates_' + str(x+1) for x in range(30)]
metrics_ls = ['sessions', 'pageviews']
URL_names = ['URL_1', 'URL_2']
DataDict_final = dict()
for name in URL_names:
DataDict_final[name] = {metric: [] for metric in metrics_ls}
DataDict_final['URL_1']['sessions'] = range(30) # manually define for this example
DataDict_final['URL_1']['pageviews'] = range(30)
DataDict_final['URL_2']['sessions'] = range(30)
DataDict_final['URL_2']['pageviews'] = range(30)

for cur_page in URL_names:

# plot
fig, ax = plt.subplots()
for i, cur_metric in enumerate(metrics_ls):
data2plot = DataDict_final[cur_page] [cur_metric]
ax.plot(data2plot, label=cur_metric)

# x and y axis limits and labels
ax.set_xlim(0, len(DataDict_final[cur_page] [cur_metric])-1)
x_labs1 = [int(label.get_position()[0]) for label in ax.get_xticklabels()]
x_labs2 = [dates_ls[x] for x in x_labs1]
ax.set_xticklabels(x_labs2, fontsize=8, rotation=45, ha='right')

在上面,我循环遍历 URL_names 和metrics_ls,它们是字典键列表,允许我获取 data2plot,它只是一个数字列表。如果我突出显示并使用 for 循环运行代码,它可以正常工作,但如果我运行整个循环,生成多个数字,x_labs1 最终会成为 0 的列表,因此我所有的 x-tick 标签都是相同的,每个标签都是相同的date_ls 中的第一项。

最佳答案

问题中的方法不太适合确定性地设置刻度标签。刻度标签应根据其标记的值设置,而不是屏幕上的位置。

为了自定义刻度标签,FuncFormatter 通常很有帮助。这可以采用一个函数作为输入,在给定要刻度的 x 值的情况下返回所需的刻度标签。

def fmt(x,pos):
if x in range(len(dates_ls)):
return dates_ls[int(x)]
else:
return ""

# then later
ax.xaxis.set_major_formatter(FuncFormatter(fmt))
plt.setp(ax.get_xticklabels(), fontsize=8, rotation=45, ha='right')

完整示例:

import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter

dates_ls = ['dates_' + str(x+1) for x in range(30)]
metrics_ls = ['sessions', 'pageviews']
URL_names = ['URL_1', 'URL_2']
DataDict_final = dict()
for name in URL_names:
DataDict_final[name] = {metric: [] for metric in metrics_ls}
DataDict_final['URL_1']['sessions'] = range(30) # manually define for this example
DataDict_final['URL_1']['pageviews'] = range(30)
DataDict_final['URL_2']['sessions'] = range(30)
DataDict_final['URL_2']['pageviews'] = range(30)

def fmt(x,pos):
if x in range(len(dates_ls)):
return dates_ls[int(x)]
else:
return ""

for cur_page in URL_names:

# plot
fig, ax = plt.subplots()
for i, cur_metric in enumerate(metrics_ls):
data2plot = DataDict_final[cur_page] [cur_metric]
ax.plot(data2plot, label=cur_metric)
# x and y axis limits and labels
ax.set_xlim(0, len(DataDict_final[cur_page] [cur_metric])-1)
ax.xaxis.set_major_formatter(FuncFormatter(fmt))
plt.setp(ax.get_xticklabels(), fontsize=8, rotation=45, ha='right')

plt.show()

enter image description here

请注意,如果这样做的目的是在轴上显示日期时间,那就太复杂了。相反,使用 datetime objectes 直接绘制数据,如 Datetime example 中所示。

关于python - 获取默认的 x 刻度标签文本用作索引,以使用其他文本更新刻度标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47244225/

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