如何使 xtick 与 Python matplotlib 中的 xlim 不同?
这是不可能的。xtick
本质上是您的子域xlim
(你的x范围)。 “刻度线”只不过是您的限制内的离散点,这些点是由您选择的产生的Locator https://matplotlib.org/api/ticker_api.html#tick-locating。从视觉上看,刻度线以两种方式呈现给您:首先,小正交线,我认为它给出了“刻度线”的名称,其次,显示在它附近的值。然而,如何向用户呈现价值又取决于所选择的Formatter https://matplotlib.org/api/ticker_api.html#matplotlib.ticker.Formatter。设置自定义标签归结为使用FixedFormatter https://matplotlib.org/api/ticker_api.html#matplotlib.ticker.FixedFormatter它只是返回本地刻度索引的任意标签。
See https://matplotlib.org/api/ticker_api.html 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 ticks:
如果您现在分配more自定义标签的数量大于实际的刻度数,超出的标签将被忽略。这是您经历过的行为。
有趣的事情。如果您设置自定义标签并随后增加刻度数(以及范围),会发生什么?
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 个刻度的标签:
请注意,您在设置标签后还显式更改了 x 范围。但因为底层格式化程序并不真正关心具体值,而是关心本地刻度索引,并且新的 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()
当您还删除类型转换时int
设置条形宽度时,您会收到以下结果:
附:请原谅我用“Okt”而不是“Oct”。那是我工作中的德国灵魂..:)