python - 如何在时间轴上以有限的 y 轴居中子图
问题描述
我有一些用于生成事件时间线的代码,但我想添加一个额外的线图,显示每天的销售量。但是当我运行绘图时,时间线会被压缩,Y 轴会扩展到新的绘图。解决这个问题的唯一方法是标准化数量图值,这似乎符合时间线图的 y 轴限制,但理想情况下,我想保留第一张图片中线图的原始值并得到它与第二张图片中的时间线图一起使用,因此它是原始值并正确居中/缩放。数据只是格式化为文本文件,如下所示:Date,Event \n 2021 年 7 月 12 日,事件 1
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
def GenerateTimeLine2(data, data02, title="Timeline", xaxis_format="%d %b", day_interval=5, figsize=(8, 5)):
levels = np.array([-5, 5, -3, 3, -1, 1])
fig, ax = plt.subplots(figsize=figsize)
# Create the base line
start = min(data.index)
stop = max(data.index)
ax.plot((start, stop), (0, 0), 'k', alpha=.5)
# Iterate through data annoting each one
for ii, (idate, iname) in enumerate(data.itertuples()):
level = levels[ii % 6]
vert = 'top' if level < 0 else 'bottom'
ax.scatter(idate, 0, s=100, facecolor='w', edgecolor='k', zorder=9999)
# Plot a line up to the text
ax.plot((idate, idate), (0, level), c='r', alpha=.7)
# Give the text a faint background and align it properly
ax.text(idate, level, iname,ha='right', va=vert, fontsize=14,
backgroundcolor=(1., 1., 1., .3))
ax.set(title=title)
# Set the xticks formatting
# format xaxis with days intervals
ax.get_xaxis().set_major_locator(mdates.DayLocator(interval=day_interval))
ax.get_xaxis().set_major_formatter(mdates.DateFormatter(xaxis_format))
fig.autofmt_xdate()
#add in overlay line plot
#ax.plot(data02)
#print(ax.axis())
#min_c = min(data02.values.tolist())
#max_c = max(data02.values.tolist())
#ax.set_ylabel(min_c,max_c)
norm = lambda x: 5*(x-x.min())/(x.max()-x.min())
ax.set_yticks(norm(data02.values))
#((data02.values-(min(data02.values.tolist())))/(max(data02.values.tolist())-min(data02.values.tolist()))))
ax.yaxis.tick_right()
ax.yaxis.set_major_locator(plt.MaxNLocator(5))
ax.axes.set_ylabel('Quanitity')
ax.yaxis.set_label_position("right")
ax.plot(norm(data02))
#ax.plot((min_c,max_c), (0, 0), 'k', alpha=.5)
#print(ax.yaxis)
# Remove components for a cleaner look
plt.setp((list(ax.spines.values())), visible=False)#ax.get_yticklabels() +
return ax
data = pd.read_csv(r'testdata01.txt', parse_dates=True, index_col=0)
data02 = pd.read_csv(r'rap_a.txt', parse_dates=True, index_col=0)
ax = GenerateTimeLine2(data,data02,title='Event Timeline',
day_interval=1,figsize=(8,5))
#ax.patch.set_facecolor('gray')
#ax.plot(data02)
plt.show()
解决方案
推荐阅读
- git - git filter 分支到 git filter repo 转换
- c++ - 在c ++中将数组从函数返回到main
- r - 在grid.arrange上使用rot =旋转标签不起作用
- python - sqlite3中的主键
- java - 使用 Criteria Builder API 在 JPA 中加入自定义查询
- scala - Scala - 回调的返回值
- javascript - 如何向此函数添加鼠标悬停事件?
- c# - 如何在用 c# 编写的 UWP 应用中从 Windows 运行时组件 (c#) 调用函数?
- asp.net - 如何发布网站但阻止访问者?
- android - Retrofit 2 添加 Header - 日志拦截器