飞道的博客

python可视化48|最常用11个分布(Distribution)关系图

249人阅读  评论(0)

"pythonic生物人"的第155篇分享

往期精彩戳:NGS精进 |统计精进| py基础 |py绘图 | perl基础 | R绘图


本文分享最常用的「11个分布(Distribution)关系图」

续前篇:

python可视化45|最常用10个关联(Correlation)关系图

python可视化46|最常用6个偏差(Deviation)关系图

python可视化47|最常用5个排序(Ranking)关系图

目录

四、分布(Distribution)关系图

21、连续变量堆积直方图(Stacked Histogram for Continuous Variable)

该图展示给定连续变量的频率分布。


   
  1. # Import Data
  2. df = pd.read_csv( "./datasets/mpg_ggplot2.csv")
  3. # Prepare data
  4. x_var =  'displ'
  5. groupby_var =  'class'
  6. df_agg = df.loc[:, [x_var, groupby_var]].groupby(groupby_var)
  7. vals = [df[x_var].values.tolist()  for i, df in df_agg]
  8. # Draw
  9. plt.figure(figsize=( 106), dpi= 80)
  10. colors = [plt.cm.Set1(i / float( len(vals) -  1))  for i in  range( len(vals))]
  11. n, bins, patches = plt.hist(vals,
  12.                              30,
  13.                             stacked=True,
  14.                             density=False,
  15.                             color=colors[: len(vals)])
  16. # Decoration
  17. plt.legend({
  18.     group: col
  19.      for group, col in zip(
  20.         np.unique(df[groupby_var]).tolist(), colors[: len(vals)])
  21. })
  22. plt.title(f "Stacked Histogram of ${x_var}$ colored by ${groupby_var}$",
  23.           fontsize= 22)
  24. plt.xlabel(x_var)
  25. plt.ylabel( "Frequency")
  26. #plt.ylim( 025)
  27. plt.xticks(ticks=bins[:: 3], labels=[round(b,  1for b in bins[:: 3]])
  28. plt.show()

22、类别变量堆积直方图(Stacked Histogram for Categorical Variable)

该图展示给定类别变量的频率分布。


   
  1. # Import Data
  2. df = pd.read_csv( "./datasets/mpg_ggplot2.csv")
  3. # Prepare data
  4. x_var =  'manufacturer'
  5. groupby_var =  'class'
  6. df_agg = df.loc[:, [x_var, groupby_var]].groupby(groupby_var)
  7. vals = [df[x_var].values.tolist()  for i, df in df_agg]
  8. # Draw
  9. plt.figure(figsize=( 106), dpi= 80)
  10. colors = [plt.cm.Set1(i / float( len(vals) -  1))  for i in  range( len(vals))]
  11. n, bins, patches = plt.hist(vals,
  12.                             df[x_var].unique().__len__(),
  13.                             stacked=True,
  14.                             density=False,
  15.                             color=colors[: len(vals)])
  16. # Decoration
  17. plt.legend({
  18.     group: col
  19.      for group, col in zip(
  20.         np.unique(df[groupby_var]).tolist(), colors[: len(vals)])
  21. })
  22. plt.title(f "Stacked Histogram of ${x_var}$ colored by ${groupby_var}$",
  23.           fontsize= 22)
  24. plt.xlabel(x_var)
  25. plt.ylabel( "Frequency")
  26. plt.ylim( 040)
  27. plt.xticks(ticks=bins,
  28.            labels=np.unique(df[x_var]).tolist(),
  29.            rotation= 90,
  30.            horizontalalignment= 'left')
  31. plt.show()

了解更多直方图:

23、密度图(Density Plot)

该图展示连续变量的分布情况。


   
  1. # Import Data
  2. df = pd.read_csv( "./datasets/mpg_ggplot2.csv")
  3. # Draw Plot
  4. plt.figure(figsize=( 108), dpi= 80)
  5. sns.kdeplot(df.loc[df[ 'cyl'] ==  4"cty"],
  6.             shade=True,
  7.             color= "#01a2d9",
  8.             label= "Cyl=4",
  9.             alpha= .7)
  10. sns.kdeplot(df.loc[df[ 'cyl'] ==  5"cty"],
  11.             shade=True,
  12.             color= "#dc2624",
  13.             label= "Cyl=5",
  14.             alpha= .7)
  15. sns.kdeplot(df.loc[df[ 'cyl'] ==  6"cty"],
  16.             shade=True,
  17.             color= "#C89F91",
  18.             label= "Cyl=6",
  19.             alpha= .7)
  20. sns.kdeplot(df.loc[df[ 'cyl'] ==  8"cty"],
  21.             shade=True,
  22.             color= "#649E7D",
  23.             label= "Cyl=8",
  24.             alpha= .7)
  25. # Decoration
  26. sns.set(style= "whitegrid", font_scale= 1.1)
  27. plt.title( 'Density Plot of City Mileage by n_Cylinders', fontsize= 18)
  28. plt.legend()
  29. plt.show()

24、带直方图的密度图(Density Curves with Histogram)


   
  1. # Import Data
  2. df = pd.read_csv( "./datasets/mpg_ggplot2.csv")
  3. # Draw Plot
  4. plt.figure(figsize=( 108), dpi= 80)
  5. sns.distplot(df.loc[df[ 'class'] ==  'compact'"cty"],
  6.              color= "#01a2d9",
  7.              label= "Compact",
  8.              hist_kws={ 'alpha'.7},
  9.              kde_kws={ 'linewidth'3})
  10. sns.distplot(df.loc[df[ 'class'] ==  'suv'"cty"],
  11.              color= "#dc2624",
  12.              label= "SUV",
  13.              hist_kws={ 'alpha'.7},
  14.              kde_kws={ 'linewidth'3})
  15. sns.distplot(df.loc[df[ 'class'] ==  'minivan'"cty"],
  16.              color= "g",
  17.              label= "#C89F91",
  18.              hist_kws={ 'alpha'.7},
  19.              kde_kws={ 'linewidth'3})
  20. plt.ylim( 00.35)
  21. # Decoration
  22. sns.set(style= "whitegrid", font_scale= 1.1)
  23. plt.title( 'Density Plot of City Mileage by Vehicle Type', fontsize= 18)
  24. plt.legend()
  25. plt.show()

更多核密度图:

25、山峰叠峦图(Joy Plot)

该图展示大量分组之间的关系,比heatmap形象。


   
  1. !pip install joypy#安装依赖包
  2. #每组数据绘制核密度图,R中有ggjoy
  3. import joypy
  4. # Import Data
  5. mpg = pd.read_csv( "./datasets/mpg_ggplot2.csv")
  6. # Draw Plot
  7. plt.figure(figsize=( 106), dpi= 80)
  8. fig, axes = joypy.joyplot(mpg,
  9.                           column=[ 'hwy''cty'],
  10.                           by= "class",
  11.                           ylim= 'own',
  12.                           colormap=plt.cm.Set1,
  13.                           figsize=( 106))
  14. # Decoration
  15. plt.title( 'Joy Plot of City and Highway Mileage by Class', fontsize= 18)
  16. plt.show()

26、分布点图(Distributed Dot Plot)

分布点图显示了按组划分的点的单变量分布。点色越浅,该区域中数据点的集中度越高。通过对中位数进行不同的着色,各组的实际位置会立即变得明显。


   
  1. import matplotlib.patches as mpatches
  2. # Prepare Data
  3. df_raw = pd.read_csv( "./datasets/mpg_ggplot2.csv")
  4. cyl_colors = { 4'tab:red'5'tab:green'6'tab:blue'8'tab:orange'}
  5. df_raw[ 'cyl_color'] = df_raw.cyl. map(cyl_colors)
  6. # Mean and Median city mileage by  make
  7. df = df_raw[[ 'cty',
  8.               'manufacturer']].groupby( 'manufacturer').apply(lambda x: x.mean())
  9. df.sort_values( 'cty', ascending=False, inplace=True)
  10. df.reset_index(inplace=True)
  11. df_median = df_raw[[ 'cty''manufacturer'
  12.                     ]].groupby( 'manufacturer').apply(lambda x: x.median())
  13. # Draw horizontal lines
  14. fig, ax = plt.subplots(figsize=( 117), dpi= 80)
  15. ax.hlines(y=df.index,
  16.           xmin= 0,
  17.           xmax= 40,
  18.           color= '#01a2d9',
  19.           alpha= 0.5,
  20.           linewidth= .5,
  21.           linestyles= 'dashdot')
  22. # Draw the Dots
  23. for i,  make in enumerate(df.manufacturer):
  24.     df_make = df_raw.loc[df_raw.manufacturer ==  make, :]
  25.     ax.scatter(y=np.repeat(i, df_make.shape[ 0]),
  26.                x= 'cty',
  27.                data=df_make,
  28.                s= 75,
  29.                edgecolors= '#01a2d9',
  30.                c= 'w',
  31.                alpha= 0.5)
  32.     ax.scatter(y=i,
  33.                x= 'cty',
  34.                data=df_median.loc[df_median.index ==  make, :],
  35.                s= 75,
  36.                c= '#dc2624')
  37. # Annotate
  38. ax.text( 33,
  39.          13,
  40.          "$red \; dots \; are \; the \: median$",
  41.         fontdict={ 'size'12},
  42.         color= '#dc2624')
  43. # Decorations
  44. red_patch = plt.plot([], [],
  45.                      marker= "o",
  46.                      ms= 10,
  47.                      ls= "",
  48.                      mec=None,
  49.                      color= '#dc2624',
  50.                      label= "Median")
  51. plt.legend(handles=red_patch)
  52. ax.set_title( 'Distribution of City Mileage by Make', fontdict={ 'size'18})
  53. ax.set_xlabel( 'Miles Per Gallon (City)')
  54. ax.set_yticks(df.index)
  55. ax.set_yticklabels(df.manufacturer.str.title(),
  56.                    fontdict={ 'horizontalalignment''right'})
  57. ax.set_xlim( 140)
  58. plt.gca().spines[ "top"].set_visible(False)
  59. plt.gca().spines[ "bottom"].set_visible(False)
  60. plt.gca().spines[ "right"].set_visible(False)
  61. plt.gca().spines[ "left"].set_visible(False)
  62. plt.grid(axis= 'both', alpha= .4, linewidth= .1)
  63. plt.show()

27、箱图(boxplot)

很好的展示数据的分布情况~


   
  1. # Import Data
  2. df = pd.read_csv( "./datasets/mpg_ggplot2.csv")
  3. # Draw Plot
  4. plt.figure(figsize=( 106), dpi= 80)
  5. sns.boxplot(
  6.     x= 'class',
  7.     y= 'hwy',
  8.     data=df,
  9.     notch=False,
  10.     palette= "Set1",
  11. )
  12. # Add N Obs inside boxplot (optional)
  13. def add_n_obs(df, group_col, y):
  14.     medians_dict = {
  15.         grp[ 0]: grp[ 1][y].median()
  16.          for grp in df.groupby(group_col)
  17.     }
  18.     xticklabels = [x.get_text()  for x in plt.gca().get_xticklabels()]
  19.     n_obs = df.groupby(group_col)[y].size().values
  20.      for (x, xticklabel), n_ob in zip(enumerate(xticklabels), n_obs):
  21.         plt.text(x,
  22.                  medians_dict[xticklabel] *  1.01,
  23.                   "#obs : " + str(n_ob),
  24.                  horizontalalignment= 'center',
  25.                  fontdict={ 'size'12},
  26.                  color= 'black')
  27. add_n_obs(df, group_col= 'class', y= 'hwy')
  28. # Decoration
  29. sns.set(style= "whitegrid", font_scale= 1.1)
  30. plt.title( 'Box Plot of Highway Mileage by Vehicle Class', fontsize= 16)
  31. plt.ylim( 1040)
  32. plt.show()

28、箱图结合点图(Dot + Box Plot)

该图展示箱图及箱图绘制所用的详细点。


   
  1. # Import Data
  2. df = pd.read_csv( "./datasets/mpg_ggplot2.csv")
  3. # Draw Plot
  4. plt.figure(figsize=( 1310), dpi= 80)
  5. sns.boxplot(
  6.     x= 'class',
  7.     y= 'hwy',
  8.     data=df,
  9.     hue= 'cyl',
  10.     palette= "Set1",
  11. )
  12. plt.legend(loc= 9)
  13. sns.stripplot(x= 'class',
  14.               y= 'hwy',
  15.               data=df,
  16.               color= '#dc2624',
  17.               size= 5,
  18.               jitter= 1)
  19. for i in  range( len(df[ 'class'].unique()) -  1):
  20.     plt.vlines(i +  .51045, linestyles= 'solid', colors= 'gray', alpha= 0.2)
  21. # Decoration
  22. plt.title( 'Box Plot of Highway Mileage by Vehicle Class', fontsize= 18)
  23. plt.show()

更多关于箱图:

29、小提琴图(Violin Plot)

比箱图更好看,但不常用,小提琴的形状或面积由该位置数据次数决定。


   
  1. # Import Data
  2. df = pd.read_csv( "./datasets/mpg_ggplot2.csv")
  3. # Draw Plot
  4. plt.figure(figsize=( 1310), dpi= 80)
  5. sns.violinplot(x= 'class',
  6.                y= 'hwy',
  7.                data=df,
  8.                scale= 'width',
  9.                palette= 'Set1',
  10.                inner= 'quartile')
  11. # Decoration
  12. plt.title( 'Violin Plot of Highway Mileage by Vehicle Class', fontsize= 18)
  13. plt.show()

30、金字塔图(Population Pyramid)

可以理解为一种排过序的分组水平柱状图barplot,可很好展示不同分组之间的差异,可可视化逐级过滤或者漏斗的每个阶段。


   
  1. # Read data
  2. df = pd.read_csv( "./datasets/email_campaign_funnel.csv")
  3. # Draw Plot
  4. plt.figure(figsize=( 128), dpi= 80)
  5. group_col =  'Gender'
  6. order_of_bars = df.Stage.unique()[:: -1]
  7. colors = [
  8.     plt.cm.Set1(i / float( len(df[group_col].unique()) -  1))
  9.      for i in  range( len(df[group_col].unique()))
  10. ]
  11. for c, group in zip(colors, df[group_col].unique()):
  12.     sns.barplot(x= 'Users',
  13.                 y= 'Stage',
  14.                 data=df.loc[df[group_col] == group, :],
  15.                 order=order_of_bars,
  16.                 color=c,
  17.                 label=group)
  18. # Decorations
  19. plt.xlabel( "$Users$")
  20. plt.ylabel( "Stage of Purchase")
  21. plt.yticks(fontsize= 12)
  22. plt.title( "Population Pyramid of the Marketing Funnel", fontsize= 18)
  23. plt.legend()
  24. plt.show()

31、分类图(Categorical Plots)

展示彼此相关多个(>=2个)分类变量的计数分布,其实就是seaborn的分面图。


   
  1. # Load Dataset
  2. titanic = pd.read_csv( './datasets/titanic.csv')
  3. # Plot
  4. g = sns.catplot( "alive",
  5.                 col= "deck",
  6.                 col_wrap= 4,
  7.                 data=titanic[titanic.deck.notnull()],
  8.                 kind= "count",
  9.                 height= 3.5,
  10.                 aspect= .8,
  11.                 palette= 'Set1')
  12. plt.show()

   
  1. # Plot
  2. sns.catplot(x= "age",
  3.             y= "embark_town",
  4.             hue= "sex",
  5.             col= "class",
  6.             data=titanic[titanic.embark_town.notnull()],
  7.             orient= "h",
  8.             height= 5,
  9.             aspect= 1,
  10.             palette= "Set1",
  11.             kind= "violin",
  12.             dodge=True,
  13.             cut= 0,
  14.             bw= .2)

更多关于分面图:


有用请“点赞”“在看”“分享”


转载:https://blog.csdn.net/qq_21478261/article/details/113750415
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场