gpt4 book ai didi

python - 如何使 xtick 与 Python matplotlib 中的 xlim 不同?

转载 作者:行者123 更新时间:2023-11-28 21:05:55 26 4
gpt4 key购买 nike

我想用 Python 每天为一年的过程制作一个动态图。

坐标轴的X轴为12个月,在Matplotlib中处理为barh,代码如下:

import random
import datetime
import matplotlib.pyplot as plt

def get_percent():
today = datetime.date.today()
start = datetime.date(today.year, 1, 1)
diff = today - start
percent = diff.days/365.0
return percent

fig = plt.figure(figsize=(8,2))
ax = fig.add_subplot(1,1,1)
percent = get_percent()

ax.axis([0, 12, 0, 1])
month = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug','Sep', 'Nov', 'Dec']
ax.set_xticklabels(month)
ax.set_xlim(0, 100)
ax.barh(bottom=0.5,width=int(percent*100),height=0.2)

plt.show()
plt.close()

但是在 plot 之后,xtick 显示 july 为 100% of the year,这不是我想要的。

enter image description here

我搜索了 matplotlib 的文档,但没有找到答案:(。我怎样才能让 x 轴刻度显示一月到十二月,而条形图显示年份的百分比?

最佳答案

How can I make xtick different from xlim in Python matplotlib?

那是不可能的。 xtick 本质上是您的 xlim(您的 x 范围)中的一个子域。 “滴答声”只不过是您所选择的 Locator 产生的限制范围内的离散点。 .在视觉上,刻度以两种方式呈现给您:首先,小的正交线,我认为它给了“刻度”它的名字,其次,显示在它附近的值。但是,如何将值呈现给用户又取决于所选的 Formatter。 .设置自定义标签归结为使用 FixedFormatter它只是返回本地刻度索引的任意标签。

参见 https://matplotlib.org/api/ticker_api.html了解更多详情。


您的代码出了什么问题?

fig = plt.figure(figsize=(8,2))
ax = fig.add_subplot(1,1,1)
ax.axis([0, 12, 0, 1])
ax.get_xticks()
# returns array([ 0., 2., 4., 6., 8., 10., 12.])

设置限制你如何做它产生恰好 6 刻度:

Image 1

如果您现在分配的自定义标签更多 比实际的刻度数多,那么多余的标签将被忽略。这是您遇到的行为。

有趣的事情。如果您设置自定义标签并随后增加刻度数(以及范围),会发生什么情况?

fig = plt.figure(figsize=(8,2))
ax = fig.add_subplot(1,1,1)
ax.axis([0, 12, 0, 1])
ax.set_xticklabels(['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep','Oct', 'Nov', 'Dec'])
ax.set_xticks(range(24)) # [0, 1, ..., 22, 23]
ax.get_xlim()
# returns (0.0, 23.0)

它会增加您的 x 范围 (!) 并且不会显示超过 12 个刻度的标签:

Image 2

请注意,您在设置标签后还明确更改了 x 范围。但是由于底层 Formatter 并不真正关心具体值,而是关心本地刻度索引和新的 x 范围具有相同数量的刻度,因此您无法真正看到发生了什么。设置 xlim(0, 100) 后,您的报价实际上是 [0, 20, 40, ... 100] 而不是 [0 ... 12] 了。这很容易导致错误,这就是为什么您应该始终尝试在一个域中始终如一地操作(0-12 个月,0-100/0-1 百分比)。


解决问题:选择域!

为了这个例子,我选择月份作为我们的域,这意味着我们在 0 到 12 的范围内操作。请注意,下限 0 对应于 1 月 1 日,上限 12 对应于 12 月 31 日.我们现在可以左对齐每月刻度(等于 ax.set_xticks(range(12)))或将它们居中放在相应的月份下(等于 import numpy as np; ax.set_xticks(np .arange(0, 12, 1) + 0.5)).当我们将限制设置为 (0, 12) 时,修改刻度不会更改限制。

使用月份作为域还意味着您的百分比值 (0, 1) 是相对于 (0, 12) 而不是 (0, 100 )。因此,您必须将其乘以 12 才能获得所需的宽度。

综合起来:

import random
import datetime
import matplotlib.pyplot as plt

def get_percent():
today = datetime.date.today()
start = datetime.date(today.year, 1, 1)
diff = today - start
percent = diff.days/365.0
return percent

fig = plt.figure(figsize=(8,2))
ax = fig.add_subplot(1,1,1)
percent = get_percent()

ax.axis([0, 12, 0, 1])
month = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec']
ax.set_xticks(range(12)) # ticks placed on [0, 1, ..., 11]
ax.set_xticklabels(month)
ax.barh(bottom=0.5,width=int(percent*12),height=0.2)

plt.show()
plt.close()

Plot

如果您在设置条形宽度时还删除了对 int 的类型转换,您会收到以下结果:

Float Plot

附言请原谅我用“Okt”而不是“Oct”。那是我工作中的德国灵魂……:)

关于python - 如何使 xtick 与 Python matplotlib 中的 xlim 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43392560/

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