具有两个y轴的Seaborn绘图

时间:2020-03-16 19:09:48

标签: python seaborn

如何使用带有两个y轴的Seaborn散点图创建直方图:一个显示计数,另一个显示相应的密度?我尝试了这段代码,但结果没有意义:

ax = sns.distplot( df_flavors.Freq, kde = False )
ax.set_title( 'Distribution of Flavor Purchases\nNumber Purchased', fontsize = font_title )
ax.set( ylabel = 'Count', xlabel = 'Number of Flavors Purchased' )
ax.set_xticks( range( n ))
ax.set_xticklabels( range( n ) )
##
ax2 = plt.twinx()

DataFrame df_flavors是一个具有2000条记录的大型DataFrame,每个记录都显示人们购买了多少不同口味的酸奶(0-7种口味)。这些人是n = 2000的调查的受访者。变量Freq是每个受访者的人数。 sns.distplot在左轴上产生计数;没关系。 ax2 = plt.twinx()产生第二个y轴,但不在该轴上产生百分比,而只是累积百分比;那不行有什么建议可以让您只获得右侧总计2000的百分比或密度?

1 个答案:

答案 0 :(得分:1)

可以在一个轴上绘制不带kde的直方图。另一方面,kde没有直方图。 y轴的左侧将包含计数,而y轴的右侧将包含密度。

import numpy as np
import seaborn as sns
from matplotlib import pyplot as plt

# generate some random test data
y = np.abs(np.random.normal(np.random.choice([5, 9, 15], 2000, p=[3/9, 5/9, 1/9]), 2, 2000))

ax = sns.distplot(y, kde=False)
ax.set_title('Distribution of Flavor Purchases\nNumber Purchased')
ax.set(ylabel='Count', xlabel='Number of Flavors Purchased')
n = 20
ax.set_xticks(range(n))
ax.set_xticklabels(range(n))

ax2 = plt.twinx()
ax2 = sns.distplot(y, kde=True, hist=False, ax=ax2)
ax2.set_ylabel('density')
plt.show()

example plot