在Seaborn或Matplotlib中围绕不同区域覆盖线图

2024-09-30 08:27:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我想画一个线图,并使不同的覆盖条件的基础上,如下图所示

enter image description here

我可以知道如何实现预期目标,或者如果可能,请将我引向正确的材料

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或任何其他软件包的建议


Tags: importdfindexasnppltrandompd
2条回答

使用Matplotlibadd_patchtext

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.patches as patches

import matplotlib.colors as mcolors
# nn=mcolors.CSS4_COLORS
all_colors=list(mcolors.TABLEAU_COLORS.keys())

b=1
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()
# df.to_feather('test.feather')
# df=pd.read_feather('test.feather')
df['C'] = df['type'].diff()
df['C']=df['C'].fillna(10)

nb=df.type[(df['C'] != 0)].to_frame().reset_index()
unique_val=nb['type'].drop_duplicates().sort_values().tolist()
ngroup_type=dict(zip(unique_val,[f'type {idx}' for idx in unique_val]))
nb['ngroup']=nb["type"].map(ngroup_type)
color_group=all_colors[:len(unique_val)]
res = dict(zip(unique_val, color_group))
nb["color"] = nb["type"].map(res)


starting_point=nb["index"].values.tolist()
mcolor=nb["color"].values.tolist()
group_type=nb["ngroup"].values.tolist()
nspace=4
nheight=1
fg=sns.lineplot(data=df, x="index", y="yval")
for ncolor,spoint,gtype in zip(mcolor,starting_point,group_type):
    fg.axes.add_patch(patches.Rectangle((spoint, 0),
            nspace,nheight,edgecolor = 'blue',
                                   facecolor = ncolor,fill=True,alpha=0.1,ls=':') )
    fg.axes.text(spoint+1.5, 0.1, gtype , size=10,
         va="baseline", ha="left", multialignment="left")
plt.show()

使用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()

enter image description here

相关问题 更多 >

    热门问题