Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用色调和不同比例轴的Seaborn(时间序列)箱线图_Python_Pandas_Time Series_Seaborn_Boxplot - Fatal编程技术网

Python 使用色调和不同比例轴的Seaborn(时间序列)箱线图

Python 使用色调和不同比例轴的Seaborn(时间序列)箱线图,python,pandas,time-series,seaborn,boxplot,Python,Pandas,Time Series,Seaborn,Boxplot,我有一个数据框,每个日期有许多值(datetime字段)。这些值通过使用列组在U(用户)和S(会话)中进行分类。Seaborn用于显示每个日期的两个箱线图,其中色调设置为“组” 当考虑到U(用户)对应的值比S(会话)对应的值大得多时,问题就来了,这使得S数据难以辨认。因此,我需要想出一个解决方案,使我能够以一种可以理解的方式在同一个图形中绘制两个系列(U和S) 我想知道是否可以为每个色调设置独立的Y轴(具有不同的比例),以便显示两个Y轴(与使用twinx时一样,但不会丢失色调可视化功能) 欢迎任

我有一个数据框,每个日期有许多值(datetime字段)。这些值通过使用列组在U(用户)和S(会话)中进行分类。Seaborn用于显示每个日期的两个箱线图,其中色调设置为“组”

当考虑到U(用户)对应的值比S(会话)对应的值大得多时,问题就来了,这使得S数据难以辨认。因此,我需要想出一个解决方案,使我能够以一种可以理解的方式在同一个图形中绘制两个系列(U和S)

我想知道是否可以为每个色调设置独立的Y轴(具有不同的比例),以便显示两个Y轴(与使用
twinx
时一样,但不会丢失色调可视化功能)

欢迎任何其他选择=)

S箱线图时间序列箱线图:

使用色调的组合箱线图时间序列。显然,由于Y轴的比例,不可能看到关于s组的任何信息:

数据帧的列:

|日(日期时间)| n|U数据(数字)|组(S或U)|

生成组合箱线图的代码行:

seaborn.boxplot(ax=ax,x='Day', y='n_data', hue='Group', data=df, 
                palette='PRGn', showfliers=False)

通过使用twinx找到解决方案:

fig,ax= plt.subplots(figsize=(50,10))

tmpU = groups.copy() 
tmpU.loc[tmp['Group']!='U','n_data'] = np.nan

tmpS = grupos.copy()
tmpS.loc[tmp['Group']!='S','n_data'] = np.nan

ax=seaborn.boxplot(ax=ax,x='Day', y = 'n_data', hue='Group', data=tmpU, palette = 'PRGn', showfliers=False)

ax2 = ax.twinx()

seaborn.boxplot(ax=ax2,x='Day', y = 'n_data', hue='Group', data=tmpS, palette = 'PRGn', showfliers=False)

handles,labels = ax.get_legend_handles_labels()
l= plt.legend(handles[0:2],labels[0:2],loc=1)

plt.setp(ax.get_xticklabels(),rotation=30,horizontalalignment='right')
for label in ax.get_xticklabels()[::2]:
    label.set_visible(False)

plt.show()
plt.close('all')
上面的代码生成下图:

在这种情况下,其密度太高,无法发布。因此,我将采用基于子地块的可视化,正如冻糕在其回答中所使用的那样


这对我来说不是一个明显的解决方案,所以我要感谢Parfait的回答。

考虑在同一个图形上构建单独的绘图,y轴范围根据子集数据定制。下面用随机数据进行演示,以确保再现性(适用于本文读者)

数据(U值高于S值)

绘图

fig = plt.figure(figsize=(10,5))

for i,g in enumerate(df.groupby('Group')):                
    plt.title('N_data of {}'.format(g[0]))    
    plt.subplot(2, 1, i+1) 

    seaborn.boxplot(x="Day", y="n_data", data=g[1], palette="PRGn", showfliers=False)

plt.tight_layout()
plt.show()
plt.clf()
plt.close('all')


要保留原始色调和分组,请将所有非组n_数据渲染到
np.nan

fig = plt.figure(figsize=(10,5))

for i,g in enumerate(df.Group.unique()):             
    plt.subplot(2, 1, i+1)  

    tmp = df.copy()
    tmp.loc[tmp['Group']!=g, 'n_data'] = np.nan

    seaborn.boxplot(x="Day", y="n_data", hue="Group", data=tmp,
                    palette="PRGn", showfliers=False)

plt.tight_layout()
plt.show()
plt.clf()
plt.close('all')

因此,使用两个独立轴进行分组方框图的一个选项是在
sns.boxplot的参数中使用
hue\u order=['value,np.nan]

fig=plt.figure(figsize=(14,8))
ax=sns.boxplot(x=“lon\u bucketed”,y=“value”,data=m,hue='name',hue\u order=['co2',np.nan],
宽度=0.75,showmeans=True,meanprops={“标记”:“s”,“markerfacecolor”:“黑色”,“MarkerEdge颜色”:“黑色”},线宽=0.5,调色板=自定义调色板)
ax2=ax.twinx()
ax2=sns.boxplot(ax=ax2,x=“lon\u bucketed”,y=“value”,data=m,hue='name',hue\u order=[np.nan,'g\u xco2'],
宽度=0.75,showmeans=True,meanprops={“标记”:“s”,“markerfacecolor”:“黑色”,“MarkerEdge颜色”:“黑色”},线宽=0.5,调色板=自定义调色板)
ax1.grid(alpha=0.5,其中=major)
plt.紧_布局()
ax.legend_u2;.remove()
GW=mpatches.Patch(color='seagreen',label='CO_2$')
WW=mpatches.Patch(color='mediumaquamarine',label='$XCO_2$)
图例(句柄=[GW,WW],loc='右上角',prop={'size':14},fontsize=12)
ax.set_title($XCO_2$vs.$CO_2$”,fontsize=18)
ax.set\u xlabel('Longitude[\u00b0]',fontsize=14)
ax.set_ylabel(“$CO_2$[ppm]”,fontsize=14)
ax2.set_ylabel(“$XCO_2$[ppm]”,fontsize=14)

ax.勾选参数(labelsize=14)
请显示代码。请包括数据样本。请甚至截屏问题图。我已经添加了生成组合图的线条,我参考的图像,并解释了我正在绘制的熊猫数据帧的头部。如果有任何问题或进一步的细节可能有助于解决我的问题,请不要犹豫。此外,我知道我所要求的可以用R。
fig = plt.figure(figsize=(10,5))

for i,g in enumerate(df.Group.unique()):             
    plt.subplot(2, 1, i+1)  

    tmp = df.copy()
    tmp.loc[tmp['Group']!=g, 'n_data'] = np.nan

    seaborn.boxplot(x="Day", y="n_data", hue="Group", data=tmp,
                    palette="PRGn", showfliers=False)

plt.tight_layout()
plt.show()
plt.clf()
plt.close('all')