【问题标题】:Highlighting Date Range in matplotlib在 matplotlib 中突出显示日期范围
【发布时间】:2022-01-16 14:56:46
【问题描述】:

我正在尝试使用此代码突出显示情节的一部分:

import pandas as pd
from pandas import DataFrame as df
import matplotlib
from pandas_datareader import data as web
import matplotlib.pyplot as plt
import datetime
import warnings
warnings.filterwarnings("ignore")

from matplotlib import dates as mdates

start = datetime.date(2020,1,1)
end = datetime.date.today()

stock =  'fb'

data = web.DataReader(stock, 'yahoo', start, end)
data.index = pd.to_datetime(data.index, format ='%Y-%m-%d')
data = data[~data.index.duplicated(keep='first')]
data['year'] = data.index.year
data['month'] = data.index.month
data['week'] = data.index.week
data['day'] = data.index.day
data.set_index('year', append=True, inplace =True)
data.set_index('month',append=True,inplace=True)
data.set_index('week',append=True,inplace=True)
data.set_index('day',append=True,inplace=True)

fig, ax = plt.subplots(dpi=300, figsize =(15,4))
plt.plot(data.index.get_level_values('Date'), data['Close'])
plt.axvspan((datetime(2020,3,12)), (datetime(2020,6,1)), 
            label="Labeled",color="green", alpha=0.3)

根据文档here,格式应为matplotlib.pyplot.axvspan(xmin, xmax, ymin=0, ymax=1, **kwargs)。您能否告诉我如何获得 y_min 和 y_max 的值?

locator = mdates.MonthLocator()


formatter = mdates.ConciseDateFormatter(locator)
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)
plt.show()

我试图让情节看起来像这样: https://datavizpyr.com/highlight-a-time-range-in-time-series-plot-in-python-with-matplotlib/

Interpreting Multiindex datetime

【问题讨论】:

  • ymin 和 ymax 的默认值为 0 和 1,因此将填充图形的整个垂直区域。如果要指定值,可以指定时间段的最小值和最大值。这是一个好答案吗?
  • 我正在尝试输入一个值,例如 y_min = 200 或将其留空,但我收到以下错误:TypeError: 'module' object is not callable。我该如何解决这个问题?谢谢
  • 我以为我可以使用转换,但 axvspan 已修复。所以可以用下面的代码来计算y轴最大值为200时的ymax。x0,x1 = ax.get_ylim();offset = 200;new_max = (offset - x0) / (x1 - x0);ax.axvspan(...,ymax=new_max)
  • @r-beginners 感谢您的帮助。如果我想让它计算跨越最大高度的 ymax 怎么办?所以无论我使用什么股票代码,整个地区都会被覆盖?
  • 是收盘价的最大值,所以在前面的例子中,将x1(图形区域的最大值)替换为df['Colse'].max()

标签: python matplotlib


【解决方案1】:
import pandas as pd
from pandas import DataFrame as df
import matplotlib
from pandas_datareader import data as web
import matplotlib.pyplot as plt
import datetime
import warnings
warnings.filterwarnings("ignore")

from matplotlib import dates as mdates

start = datetime.date(2020,1,1)
end = datetime.date.today()

stock =  'fb'

data = web.DataReader(stock, 'yahoo', start, end)
data.index = pd.to_datetime(data.index, format ='%Y-%m-%d')
data = data[~data.index.duplicated(keep='first')]
data['year'] = data.index.year
data['month'] = data.index.month
data['week'] = data.index.week
data['day'] = data.index.day
data.set_index('year', append=True, inplace =True)
data.set_index('month',append=True,inplace=True)
data.set_index('week',append=True,inplace=True)
data.set_index('day',append=True,inplace=True)

fig, ax = plt.subplots(dpi=300, figsize =(15,4))
ax.plot(data.index.get_level_values('Date'), data['Close'])
y0,y1 = ax.get_ylim()
offset = data['Close'].max()
new_max = (offset - y0) / (y1 - y0)
ax.axvspan((datetime.datetime(2020,3,12)), (datetime.datetime(2020,6,1)), 
            label="Labeled",color="green", alpha=0.3, ymin=0, ymax=new_max)

plt.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多