【问题标题】:matplotlib datetime X axis and bar widthsmatplotlib 日期时间 X 轴和条形宽度
【发布时间】:2020-03-24 03:54:37
【问题描述】:

我想在时间序列图表上显示具有适当条形宽度的条形。

fig,ax1=plt.subplots()

x_nums = list(range(50))
x_dates = pd.date_range(date_from,periods=50,freq='h')
y1 = list(range(50))
y2=y1.copy()
y2.reverse()

ax1.plot(x_nums, y1, color='r',zorder=10,linewidth=5)
# ax1.plot(x_dates, y1, color='r',zorder=10,linewidth=5)

ax2=ax1.twinx()    
ax2.bar(x_nums, y2, color='b',zorder=1,alpha=0.3)
# ax2.bar(x_dates, y2, color='b',zorder=1,alpha=0.3)

当我使用 x_nums 绘制时,将显示左侧图像,如果使用 x_dates,则将显示右侧。


  1. 如何制作适当宽度的条形,即与图 1 上的相同?我知道我可以设置 ax2.bar(width=.1) 或其他东西,但我想生成许多具有不同刻度数和大小的图表,我只想让 matplotlib 保持适当的宽度,就像 x_nums 是 X 轴一样。
    我尝试设置 witdth = 1/len(x_dates) 但这不适用于具有大量刻度的图表,因为它会使条形太细。
    [编辑] 答案:将 matplotlib 升级到 width 接受 np.timedelta 的版本,然后
    ax2.bar(x_dates, y2, width=(x_dates[1]-x_dates[0])*0.8)
  1. 如何将 ax1 发送到前面? zorder 在这种情况下不起作用。我仍然希望 y1 在左侧,而 y2 在右侧。
    [编辑] 答案:PyPlot move alternative y axis to background

谢谢!

【问题讨论】:

  • @rafaelgonzalez 看到了那个,没有帮助。宽度在该答案中是固定的,但我希望宽度根据我绘制的任何数据行的方式而改变。 (窄表示大量数据,宽表示少量数据)
  • 较新版本的 matplotlib 允许将宽度指定为 timedelta。
  • @JodyKlymak 你能发一些链接吗?没找到

标签: python matplotlib


【解决方案1】:

您可以将宽度指定为np.timedelta64 对象。或者请注意,1.0 的宽度是 1 天,因此要获得 40 分钟宽的条形图,您需要指定 width=40/24/60

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

fig,ax1=plt.subplots()
date_from = '2019-01-01'

x_nums = list(range(50))
x_dates = pd.date_range(date_from,periods=50,freq='h')
y1 = np.arange(50)
y2=y1[::-1]

ax1.plot(x_dates, y1, color='r',zorder=10,linewidth=5)
ax2=ax1.twinx()
ax2.bar(x_dates, y2, color='b',zorder=1,alpha=0.3, width=np.timedelta64(40, 'm'))
plt.show()

【讨论】:

  • 我在 python 3.7 上,它失败了 @width=np.timedelta64(40, 'm')。 width=40/24/60 有效,但它仍然以某种方式固定在比例上。我希望条形图相当宽(就好像 x 轴是数字一样),无论在尺度上(秒、分钟、天、月……)。如果我以各种频率绘制此图表,我正在寻找一种可行的解决方案,例如 ['h','m','s']
  • 如果你想使用 timedelta,你需要升级你的 matplotlib。 WRT 不同的分辨率,你必须自己弄清楚。 Matplotlib 条形宽度以数据单位表示,时间单位为 1 天。默认值为 0.8 天。没有自动化设施可以使宽度成为轴尺寸的一定比例。如果是我,我会强烈考虑使用 step 而不是 bar。
  • 感谢所有帮助。我有点期望会有一些自动化的工具来使条形宽度在所有条件下看起来都“不错”(就像基于值的 x 轴一样)
  • 并且由于您的解决方案在升级 matplotlib 后有效,因此我可以执行类似 width=(x_dates[1]-x_dates[0])*0.8 的操作,适用于任何频率
猜你喜欢
  • 2018-05-20
  • 1970-01-01
  • 2020-09-11
  • 2015-05-02
  • 2020-12-07
  • 2018-09-20
  • 2020-10-01
  • 1970-01-01
  • 2013-01-04
相关资源
最近更新 更多