python - 在 Seaborn 或 Matplotlib 中围绕不同区域覆盖线图
问题描述
我想绘制一个线图并根据条件进行不同的叠加,如下图所示。
我可以知道如何,或者如果可能的话,请将我重定向到有关实现预期目标的正确材料。
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
np.random.seed(0)
rng = np.random.default_rng(2)
mlist=[]
for _ in range(4):
m=np.random.rand(4).tolist()
n=rng.integers(0, 6, size=(1)).tolist()*4
df = pd.DataFrame(zip(m,n), columns=['yval','type'])
mlist.append(df)
df=pd.concat(mlist).reset_index(drop=True).reset_index()
sns.lineplot(data=df, x="index", y="yval")
plt.show()
欢迎使用 Matplotlib 或 Seaborn 或任何其他软件包的建议
解决方案
该部分的填充是使用 axvspan 实现的。我还使用文本进行注释。
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
np.random.seed(0)
rng = np.random.default_rng(2)
mlist=[]
for _ in range(4):
m=np.random.rand(4).tolist()
n=rng.integers(0, 6, size=(1)).tolist()*4
df = pd.DataFrame(zip(m,n), columns=['yval','type'])
mlist.append(df)
df=pd.concat(mlist).reset_index(drop=True).reset_index()
g = sns.lineplot(data=df, x="index", y="yval")
overlay = {0:'m',1:'gray',5:'r'}
for i in np.arange(0,len(df),4):
tmp = df.iloc[i:i+4, :]
v = overlay.get(tmp.type.unique()[0])
g.axvspan(min(tmp.index), max(tmp.index)+1, color=v, alpha=0.3)
g.text(((min(tmp.index)+max(tmp.index)+1) / 2)-1, 0.1,'type {}'.format(tmp.type.unique()[0]), fontsize=12)
plt.show()
推荐阅读
- sql - 如何阻止任何人向 Postgres 9.6 中的几个表添加列?
- c# - 写入 Serilog 日志文件时如何触发事件?
- java - 解析错误 com.parse.ParseRequest$ParseRequestException: i/o 失败
- reactjs - 我想在 react-table 列的单元格内创建一个按钮
- firebase - 添加 onAuthStateChanged 后帖子不加载
- firebase - 在用户本地计算机上拥有 Firebase 密钥是否安全?
- html - 在 div 的每一侧放置两个箭头并使其具有响应性
- python - 当每个数据帧的大小不同时,如何匹配和绘制两个数据帧中的对应点?
- python - tkinter: self.master.destroy() 删除两个小部件
- c# - 有没有办法写入同一个文件夹中的多个文件?