- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图从两个 pandas 数据框中绘制两个独立的东西,但 x 轴出现了一些问题。当使用 matplotlib.ticker 跳过 x-ticks 时,日期不会被跳过。结果是 x 轴值与绘制的内容不匹配。
例如,当 x-ticks 设置为基数 2 时,您会看到日期增加 1。
但是当基数设置为 4 时图形具有相同的间距,您可以在这里看到:
对于第二张图片,目标是每刻增加 4 天,因此应该显示为 22、26、30 等。
这是我正在使用的代码:
ax = plot2[['Date','change value']].plot(x='Date',color='red',alpha=1,linewidth=1.5)
plt.ylabel('Total Change')
plot_df[['Date','share change daily']].plot(x='Date',secondary_y=True,kind='bar',ax=ax,alpha=0.4,color='black',figsize=(6,2),label='Daily Change')
plt.ylabel('Daily Change')
ax.legend(['Total Change (L)','Daily Change'])
plt.xticks(plot_df.index,plot_df['Date'].values)
myLocator = mticker.MultipleLocator(base=4)
ax.xaxis.set_major_locator(myLocator)
感谢任何帮助!谢谢:)
最佳答案
首先,我建议您将日期设置为数据框的索引。这让 pandas 在您创建线图时自动很好地格式化日期标签,并让您使用 strftime
方便地创建自定义格式。方法。
第二点与此示例相关,在折线图上绘制条形图会阻止您获取 pandas 折线图日期标签,因为 x 轴单位切换为从 0 开始的整数单位(请注意,这是当您将日期用作字符串而不是 datetime
对象时也是这种情况,也就是 Pandas 中的 timestamp
对象)。您可以在创建线图(使用 DatetimeIndex)后运行 ax.get_xticks()
并在创建条形图后再次运行来自行检查。
关于刻度定位器和格式化程序、pandas 绘图默认值以及您可以定义自定义刻度和刻度标签的各种方式,有太多特殊之处,我将在此处详细介绍。因此,我建议您引用文档以获取更多信息(尽管对于您的情况,您实际上并不需要这些):Major and minor ticks , Date tick labels , Custom tick formatter for time series , more examples using ticks ,以及包含 list of tick locators and formatters 的代码模块及其参数。
此外,您可以使用 ax.get_xaxis().get_major_locator()
或 ax.get_xaxis().get_major_formatter()< 识别绘图函数使用的默认刻度定位器和格式化程序
(您可以对 y 轴和小刻度执行相同的操作)以了解引擎盖下发生的事情。
开始解决您的问题。鉴于您希望在预定义的日期范围内有固定的报价频率,我建议您避免明确选择报价定位器和格式化程序,而是简单地创建您想要的报价列表和报价标签。首先,这是一些类似于您的示例数据:
import numpy as np # v 1.19.2
import pandas as pd # v 1.1.3
import matplotlib.pyplot as plt # v 3.3.2
rng = np.random.default_rng(seed=1) # random number generator
dti = pd.bdate_range(start='2020-07-22', end='2020-09-03')
daily = rng.normal(loc=0, scale=250, size=dti.size)
total = -1900 + np.cumsum(daily)
df = pd.DataFrame({'Daily Change': daily,
'Total Change': total},
index=dti)
df.head()
Daily Change Total Change
2020-07-22 86.396048 -1813.603952
2020-07-23 205.404536 -1608.199416
2020-07-24 82.609269 -1525.590147
2020-07-27 -325.789308 -1851.379455
2020-07-28 226.338967 -1625.040488
日期设置为索引,这将简化创建绘图的代码(无需指定x
)。除了图形大小外,我使用与您提供的示例中相同的格式参数。请注意,为了设置刻度和刻度标签,我不使用 plt.xticks
,因为这是指包含条形图的辅助轴,出于某种原因,rotation
和 ha
参数被忽略。
label_daily, label_total = df.columns
# Create pandas line plot: note the 'use_index' parameter
ax = df.plot(y=label_total, color='red', alpha=1, linewidth=1.5,
use_index=False, ylabel=label_total)
# Create pandas bar plot: note that the second ylabel must be created
# after, else it overwrites the previous label on the left
df.plot(kind='bar', y=label_daily, color='black', alpha=0.4,
ax=ax, secondary_y=True, mark_right=False, figsize=(9, 4))
plt.ylabel(label_daily, labelpad=10)
# Place legend in a better location: note that because there are two
# Axes, the combined legend can only be edited with the fig.legend
# method, and the ax legend must be removed
ax.legend().remove()
plt.gcf().legend(loc=(0.11, 0.15))
# Create custom x ticks and tick labels
freq = 4 # business days
xticks = ax.get_xticks()
xticklabels = df.index[::freq].strftime('%b-%d')
ax.set_xticks(xticks[::freq])
ax.set_xticks(xticks, minor=True)
ax.set_xticklabels(xticklabels, rotation=0, ha='center')
plt.show()
可以找到格式化日期的代码here .
为了完整起见,这里有两种创建完全相同刻度的替代方法,但这次是通过明确使用 matplotlib 刻度定位器和格式化程序。
第一个替代方案像以前一样使用刻度列表和刻度标签,但这次将它们传递给 FixedLocator
和 FixedFormatter
:
import matplotlib.ticker as mticker
# Create custom x ticks and tick labels
freq = 4 # business days
maj_locator = mticker.FixedLocator(ax.get_xticks()[::freq])
min_locator = mticker.FixedLocator(ax.get_xticks())
ax.xaxis.set_major_locator(maj_locator)
ax.xaxis.set_minor_locator(min_locator)
maj_formatter = mticker.FixedFormatter(df.index[maj_locator.locs].strftime('%b-%d'))
ax.xaxis.set_major_formatter(maj_formatter)
plt.setp(ax.get_xticklabels(), rotation=0, ha='center')
当使用 IndexLocator
时,第二个替代方案利用了在索引的每个第 n 个位置创建一个刻度的选项。 , 将它与 FuncFormatter
结合起来(而不是已弃用的 IndexFormatter
):
import matplotlib.ticker as mticker
# Create custom x ticks and tick labels
maj_freq = 4 # business days
min_freq = 1 # business days
maj_locator = mticker.IndexLocator(maj_freq, 0)
min_locator = mticker.IndexLocator(min_freq, 0)
ax.xaxis.set_major_locator(maj_locator)
ax.xaxis.set_minor_locator(min_locator)
maj_formatter = mticker.FuncFormatter(lambda x, pos=None:
df.index[int(x)].strftime('%b-%d'))
ax.xaxis.set_major_formatter(maj_formatter)
plt.setp(ax.get_xticklabels(), rotation=0, ha='center')
如您所见,这两个替代方案都比最初的示例更冗长。
关于python - Matplotlib - 在保持正确的 x 值的同时跳过 xticks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64428886/
环境:Windows 7 64 位,Matlab 2014a 目标: 绘制两个待优化参数的误差热图。 放置适当的刻度线和刻度值 在正确的地方画出网格线 问题:排列 X 和 Y 刻度位置和值。当 x 轴
我用 Excel 文件中的数据创建了一个图表。我需要保留所有 xticks 但 xticklabels 只出现在每 6 个刻度上。我试过这样做: tickStep=6; Sheet=2; filena
我正在使用 Matlab 绘制数据并尝试处理刻度/刻度标签。 我打算做什么 绘制带有动态刻度标签的图表,这样我就可以找出图表上特定点的时间戳。因此时间戳 (xTickLabel) 应该只来自数据源。
我无法使用以下代码在 xticks 之间获得更好的空间: import random import matplotlib.pyplot as plt coverages = [random.randi
在 x 轴上,我想显示数字(不旋转),并在每个数字下方显示旋转名称。我有以下内容,但想分别轮换名称“一”、“二”和“三”。 plt.xticks([1,2,3], ['1\n one', '2\n t
如何从字典中的键设置 xticks?在我的原始代码中,字典是空的,并根据数据文件进行填充,因此我不能为 xticks 设置任何静态内容。根据用户输入的内容(1-10 之间的数字),该图从该数量的最高值
我试图在对数刻度之间绘图,但存在问题; from pylab import * import matplotlib.pyplot as pyplot Ds = pow(10,5) D = np.li
我无法让我的 x 刻度标签旋转,目前它们总体 我已经尝试过(如代码所示,为了使用旋转参数,我尝试使用 plt.setp 并尝试在第一个绘图参数内旋转。如果我只有一个轴,那么它会完美绘制,它是辅助轴由于
我正在绘制两个 pandas 系列。索引是一个日期(1-1到12-31) s1.plot() s2.plot() pd.plot() 解释日期并将它们分配给轴值,如下所示: 我想将主要刻度修改为每个月
使用 Matplotlib,我有两个子图,我希望它们具有相同的自定义字符串 xticks。 这是我到目前为止尝试过的一个最小示例: import matplotlib.pyplot as plt f,
如果我绘制单个 imshow 图我可以使用 fig, ax = plt.subplots() ax.imshow(data) plt.xticks( [4, 14, 24], [5, 15, 25]
class parser(object): """docstring for parser""" def __init__(self, path): self.enco
我无法操纵所有子图上的 xticks。我正在使用的 xticks 方法(根据文档)仅更改最顶层子图的 xticks。 如何更改下部子图的 xticks? 下面是我的代码: fig = make_sub
来自 plotly doc : layout > xaxis > tickvals: Sets the values at which ticks on this axis appear. Only
我有下一个DF: A B C 1 2 'name 1' 2 3 'name 2' 3 5 'name 3' 绘制A列并将C列用作xticks的正确顺序是什么? df['A'].plot(xticks
在下图中,如何使 xTicks 适合所有 x 轴?我不明白问题出在哪里,作为新的 MATLAB 用户,我将不胜感激任何建议。 这是我绘制此图的代码部分: f=figure(); plo
我想在刻度之间放置标签,否则某些标签会相互重叠。 set(gca,'XTick',[66 98 134 215 266 330 334 388 414 443 ]); set(gca,'XTickLa
我正在尝试按对象绘制组,但 x 轴标签未对齐。有什么帮助吗?谢谢。 我的代码: gdp_by_region.plot(kind='bar', align= 'center') plt.xticks(f
这个问题已经有答案了: Changing the tick frequency on the x or y axis (14 个回答) 已关闭 4 年前。 我画了一个计数图,如下: ax, fig =
这个问题已经有答案了: matplotlib strings as labels on x axis (4 个回答) 已关闭 5 年前。 def plot_freq_error(diff,file,p
我是一名优秀的程序员,十分优秀!