- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想用 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,这不是我想要的。
我搜索了 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 刻度:
如果您现在分配的自定义标签更多 比实际的刻度数多,那么多余的标签将被忽略。这是您遇到的行为。
有趣的事情。如果您设置自定义标签并随后增加刻度数(以及范围),会发生什么情况?
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 范围。但是由于底层 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()
如果您在设置条形宽度时还删除了对 int
的类型转换,您会收到以下结果:
附言请原谅我用“Okt”而不是“Oct”。那是我工作中的德国灵魂……:)
关于python - 如何使 xtick 与 Python matplotlib 中的 xlim 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43392560/
R 最大的功能之一是惰性求值。这导致了一种经常遇到的风格,即可以使用一个参数作为另一个参数的值。例如,在哈德利关于 Advanced R 的伟大著作中你看this example : g [1] 1
我想绘制以下分段函数,但是我不断收到错误 a 2), 1, NA))) } plot(a, xlim=c(-5, 5), ylim = c(-4, 7), col = "red") abline
我想在 xlim( [ ] ) 中放置一个单词数组来代替一系列数字。使用普通的 python 和 matplotlib。 像这样: ax.set_xlim(['week1', 'week2', 'we
我正在尝试使用以下内容在 ggplot put 中设置 xlim 和 ylim: ylim=c(0, 1.5) + xlim=c(0,100) + 或者 coord_cartesian(xlim =
给定数据框: d = structure(list(bin_start = 1:12, bin_count = c(12892838L, 1921261L, 43
我使用轮廓f命令在matplotlib上绘制轮廓。我在频率开始时得到大量数字,但之后峰值较低。xlim 仅适用于隐藏较高的数字 - 但我希望较低的峰值成为颜色条上的最大值(我的图像中未显示)。xlim
matplotlib默认根据数据系列自动缩放坐标轴范围。pyplot模块中的autoscale函数可以切换是否自动缩放坐标轴范围,xlim()和ylim()函数可手动设置坐标轴范围。 autosc
我想在一个简单的线图中绘制两个向量,然后想在 0 x ax 点添加一条线。 这就是我尝试实现它的方式: sale <- structure(c(-0.049668136, 0.023675638, -
假设我创建了一个像这样的简单图: xvalues plot(xvalues, yvalues, xlim=c(0)) Error in plot.window(...) : invalid 'xli
有没有办法让 plot 函数自动生成相等的 xlim 和 ylim?我不想事先定义一个固定范围,但我希望 plot 函数来决定范围本身。但是,我希望它为 x 和 y 选择相同的范围。 最佳答案 一种可
我需要在 R 中设置绘图的 x 轴限制,但我的值是日期(%m/%d/%Y 格式)。我将如何改变这一点?我正在尝试绘制营养位置与收集日期。我所有的收集日期都是日期格式 (%m/%d/%Y) 这是我试过的
我的例子: x = c(1:15) y = c(-4:10) plot(x, y) R 自动给出 xlim 为:2, 4, 6, ..., 14 如何将它更改为:1, 2, 3,..., 15 我试过
举个例子,如果我想绘制一个包含点 1-5 的图并添加点 5-9,则可以使用以下方法: plot(c(1,2,3,4,5), ylim=c(0,10)) points(c(5,6,7,8,9)) 但是,
我正在尝试扩展时间序列图的 X 轴,以便为稍后向图中添加新数据做好准备。但是,无论我尝试什么,我都会收到 plot.window(...) 中的错误:无效的“xlim”值错误。 这是一个最小的代码片段
我想要同一图上的历史记录和密度,我正在尝试这样做: myPlot <- plot(density(m[,1])), main="", xlab="", ylab="") par(new=TRUE) O
我正在尝试学习如何使用 ggvis。基本上,我想重现这个 ggplot2 图表: library(ggplot2) m % ggvis(~wt, fill := "red") %>% layer_
我正在尝试用 Python 制作一个视觉上吸引人的图表。我使用的是 Randal Olson 的示例 http://www.randalolson.com/2014/06/28/how-to-make
这个问题在这里已经有了答案: How to set the subplot axis range (5 个回答) 关闭7年前。 我想限制 matplotlib 中特定子图的 X 和 Y 轴。子图本身没
我有以下代码: library(tidyverse) data_frame(x = 1:5, x1=x+1, c = c('a','a','a','b','b')) %>% ggplot(
下面的 kdeplot 在左边有一个峰值,我想更关注它: a = np.array([1] * 100 + [5]) sns.kdeplot(a) 我通常这样做的方法是 pyplot.xlim调用,但
我是一名优秀的程序员,十分优秀!