这不是重复的,因为有关类似问题的现有答案并未准确描述我的需求。 Matplotlib内部具有出色的格式化程序,我喜欢使用它们:
ax.xaxis.set_major_locator(matplotlib.dates.MonthLocator())
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%b%y'))
他们让我绘制了这样的股市图表:
这是我需要的,但是有1个问题:周末。它们出现在x轴上,使我的图表有些难看。
有关此问题的其他问题为创建自定义格式器提供了建议。它们显示了此类格式化程序的示例。但是没有人能像matplotlib一样进行漂亮的格式化:
5月19日,6月19日,7月19日...
我的意思是这行代码:
ax.xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%b%y'))
我的问题是:请像matplotlib一样帮助我格式化x轴:5月19日,6月19日,7月19日...并且不要在股市关闭时创建周末。
答案 0 :(得分:2)
您几乎总能做的事情与 Nic Wanavit 建议的类似。 根据轴上的需要手动设置标签。
特别是在这种情况下,该图看起来有点难看,因为您的数据中的时间跨度未提供实际数据(在这种情况下为周末),因此 pyplot 将简单地将这些点与 x- 的相应长度连接起来轴。
然后你可以做的只是绘制同样远的数据 - 如果数据是每天的,这是正确的 - 否则考虑使用例如插入它pandas bultin 插值。
为了避免 pyplot 自动检测索引,我必须这样做:
df['plotidx'] = [i for i in range(len(df['close'])):
这里股票的所有收盘价都存储在名为“close”obvsl 的列中。 你相应地绘制这个。 然后您可以通过
获取所有创建的刻度labels = [item.get_text() for item in ax.get_xticklabels()]
根据需要调整它们
labels[i] = string_for_the_label_no_i
然后使用
让它们回到图表上ax.xaxis.set_ticklabels(labels)
然后你需要稍微“更新”情节。还请记住,调整大小可能最终导致标签也如文档中所述的奇怪位置。 这是一种解决方法,但对我来说效果很好,因为绘制彼此距离相等的数据而不是为周末制作一些数据感觉很自然。
问候
答案 1 :(得分:0)
设置x刻度 假设您在数据框行df ['dates']
中有dates变量ax.xaxis.set_ticks(df['dates'])
答案 2 :(得分:-1)
IIUC,您可以使用pandas
及其日期时间功能对进入图形的数据进行子集化,使其仅包含工作日。
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter
# Create reproducible data set & fill weekends
df = pd.read_csv("https://vincentarelbundock.github.io/Rdatasets/csv/Stat2Data/AppleStock.csv", index_col=0)
df.columns = df.columns.map(str.lower)
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
ix = pd.DatetimeIndex(start=df.index.min(),
end=df.index.max(),
freq='D')
df = df.reindex(ix)
df.fillna(method='ffill', inplace=True)
# Plot with all dates included
plt.plot(df.index, df['price'])
ax = plt.gca()
ax.xaxis.set_major_formatter(DateFormatter('%b%y'))
plt.show()
# Plot with only weekdays
df2 = df.loc[df.index.to_series().dt.weekday < 5]
plt.plot(df2.index, df2['price'])
ax = plt.gca()
ax.xaxis.set_major_formatter(DateFormatter('%b%y'))
plt.show()