目录
- 04 Distribution
- 4.0 Prerequisite
- 4.1 连续变量的直方图(Histogram for Continuous Variable)
- 4.2 分类变量的直方图(Histogram for Categorical Variable)
- 4.3 Density Plot
- 4.4 Density Curves with Histogram
- 4.5 Joy Plot
- 4.6 Distributed Dot Plot
- 4.7 Box Plot
- 4.8 Dot + Box Plot
- 4.9 Violin Plot
- 4.10 Population Pyramid
- 4.11 Categorical Plots
- References
04 Distribution
4.0 Prerequisite
-
Setup.py
# !pip install brewer2mpl
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
import warnings; warnings.filterwarnings(action='once')
large = 22; med = 16; small = 12
params = {'axes.titlesize': large,
'legend.fontsize': med,
'figure.figsize': (16, 10),
'axes.labelsize': med,
'axes.titlesize': med,
'xtick.labelsize': med,
'ytick.labelsize': med,
'figure.titlesize': large}
plt.rcParams.update(params)
# plt.style.use('seaborn-whitegrid')
plt.style.use("seaborn-v0_8")
sns.set_style("white")
# %matplotlib inline
# Version
print(mpl.__version__) #> 3.7.1
print(sns.__version__) #> 0.12.2
4.1 连续变量的直方图(Histogram for Continuous Variable)
-
Histogram shows the frequency distribution of a given variable. The below representation groups the frequency bars based on a categorical variable giving a greater insight about the continuous variable and the categorical variable in tandem. Create histogram and learn how to interpret them in this free video tutorial.
直方图显示了给定变量的频率分布。下面的表示根据一个分类变量对频率条进行分组,从而更好地理解连续变量和分类变量之间的关系。
直方图是一种可视化工具,用于展示连续变量的频率分布情况。它将连续变量的取值范围划分为若干个等宽的区间(也称为箱子或区间),然后统计每个区间内的观测值数量或频率。
在上述描述中,提到了一个额外的因素,即基于一个分类变量对频率条进行分组。这意味着可以使用某个分类变量来将观测值分组,然后在每个组内绘制直方图。这种绘制方式可以提供更多关于连续变量和分类变量之间关系的见解。
通过创建直方图,我们可以直观地了解连续变量的分布情况。直方图的横轴表示连续变量的取值范围,纵轴表示频率或观测值数量。直方图的柱状条表示每个区间内的观测值数量或频率,柱状条的高度越高,表示该区间内的观测值越多。
通过观察直方图,我们可以得到以下信息:
1)连续变量的整体分布形状:直方图的整体形状可以告诉我们连续变量的分布情况,例如是否呈现正态分布、偏态分布或双峰分布等。
2)连续变量的中心位置:直方图的峰值所在的区间可以提供连续变量的中心位置信息。
3)连续变量的范围和离散程度:直方图的横轴范围和柱状条的高度可以帮助我们了解连续变量的取值范围和离散程度。
通过将直方图与分类变量结合使用,我们可以更好地理解连续变量和分类变量之间的关系。这种组合可以揭示在不同分类变量水平下连续变量的分布差异,帮助我们发现潜在的模式或趋势。 -
mpg_ggplot2.csv
展示不同汽车制造商的城市燃油效率(每加仑行驶的英里数):
"manufacturer","model","displ","year","cyl","trans","drv","cty","hwy","fl","class"
"audi","a4",1.8,1999,4,"auto(l5)","f",18,29,"p","compact"
"audi","a4",1.8,1999,4,"manual(m5)","f",21,29,"p","compact"
"audi","a4",2,2008,4,"manual(m6)","f",20,31,"p","compact"
"audi","a4",2,2008,4,"auto(av)","f",21,30,"p","compact"
"audi","a4",2.8,1999,6,"auto(l5)","f",16,26,"p","compact"
"chevrolet","c1500 suburban 2wd",5.3,2008,8,"auto(l4)","r",14,20,"r","suv"
"chevrolet","c1500 suburban 2wd",5.3,2008,8,"auto(l4)","r",11,15,"e","suv"
"chevrolet","c1500 suburban 2wd",5.3,2008,8,"auto(l4)","r",14,20,"r","suv"
"chevrolet","c1500 suburban 2wd",5.7,1999,8,"auto(l4)","r",13,17,"r","suv"
- 程序代码为:
# 目的是根据车辆类型(class)对发动机排量(displ)进行堆叠直方图的可视化。每个直方图的颜色表示不同的车辆类型,柱子的高度表示频数(数量)。
# Import Data
# 使用pd.read_csv函数从指定的URL读取CSV文件,并将其存储在名为df的DataFrame中:
df = pd.read_csv("https://github.com/selva86/datasets/raw/master/mpg_ggplot2.csv")
# Prepare data
# 选择两个变量,x_var表示横轴变量为'displ'(发动机排量),groupby_var表示按照'class'(车辆类型)进行分组。代码通过对数据进行分组并提取特定变量的方式,得到每个分组的值。
x_var = 'displ'
groupby_var = 'class'
# 对DataFrame进行索引,只选择x_var和groupby_var两列的数据,并使用groupby函数按groupby_var进行分组:
df_agg = df.loc[:, [x_var, groupby_var]].groupby(groupby_var)
# 使用列表推导式遍历每个分组,并将每个分组的x_var值存储在名为vals的列表中:
vals = [df[x_var].values.tolist() for i, df in df_agg]
# Draw
plt.figure(figsize=(16,9), dpi= 80)
# 定义颜色列表,用于为每个分组设置不同的颜色。这里使用了plt.cm.Spectral颜色映射函数。
colors = [plt.cm.Spectral(i/float(len(vals)-1)) for i in range(len(vals))]
# 使用plt.hist函数绘制堆叠直方图。vals是一个包含每个分组值的列表,30表示直方图的柱子数量,stacked=True表示堆叠显示直方图,density=False表示纵轴为频数。函数返回直方图的计数值、柱子边界和绘制的图形对象:
n, bins, patches = plt.hist(vals, 30, stacked=True, density=False, color=colors[:len(vals)])
# Decoration
# 添加图形装饰。使用plt.legend函数添加图例,将每个分组对应的颜色与分组名称关联起来。设置标题、横轴名称、纵轴名称、纵轴范围和横轴刻度。
plt.legend({group:col for group, col in zip(np.unique(df[groupby_var]).tolist(), colors[:len(vals)])})
plt.title(f"Stacked Histogram of ${x_var}$ colored by ${groupby_var}$", fontsize=22)
plt.xlabel(x_var)
plt.ylabel("Frequency")
plt.ylim(0, 25)
plt.xticks(ticks=bins[::3], labels=[round(b,1) for b in bins[::3]])
plt.show()
- 运行结果为:
4.2 分类变量的直方图(Histogram for Categorical Variable)
-
The histogram of a categorical variable shows the frequency distribution of a that variable. By coloring the bars, you can visualize the distribution in connection with another categorical variable representing the colors.
分类变量的直方图显示了该变量的频率分布。通过对柱子进行着色,可以将其与表示颜色的另一个分类变量的分布进行可视化。 -
程序代码为:
# Import Data
df = pd.read_csv("https://github.com/selva86/datasets/raw/master/mpg_ggplot2.csv")
# Prepare data
# x_var被设置为字符串'manufacturer',表示在x轴上要显示的变量是制造商。groupby_var被设置为字符串'class',表示要根据类别进行分组。
x_var = 'manufacturer'
groupby_var = 'class'
# 使用df.loc函数选择df中的x_var和groupby_var列,并使用groupby方法按groupby_var分组。这将创建一个分组后的DataFrame对象df_agg。
df_agg = df.loc[:, [x_var, groupby_var]].groupby(groupby_var)
# 使用列表推导式生成一个名为vals的列表。在每次迭代中,从df_agg中获取分组后的DataFrame,并提取x_var列的值并转换为列表。这将为每个类别创建一个列表,其中包含该类别下的所有制造商。
vals = [df[x_var].values.tolist() for i, df in df_agg]
# Draw
plt.figure(figsize=(16,9), dpi= 80)
# 生成一组颜色,用于堆叠直方图的每个类别。这里使用plt.cm.Spectral函数生成颜色,通过将i除以len(vals)-1来控制颜色的渐变。
colors = [plt.cm.Spectral(i/float(len(vals)-1)) for i in range(len(vals))]
# 使用plt.hist函数绘制堆叠直方图。其中,vals是要绘制的值的列表,df[x_var].unique().__len__()表示x轴上的条形数,即不同制造商的数量。stacked=True表示堆叠直方图,density=False表示显示的是频数而不是密度。color=colors[:len(vals)]表示使用之前生成的颜色列表。
n, bins, patches = plt.hist(vals, df[x_var].unique().__len__(), stacked=True, density=False, color=colors[:len(vals)])
# Decoration
# 使用plt.legend函数添加图例。通过使用字典推导式,将每个类别和其对应的颜色进行映射。
plt.legend({group:col for group, col in zip(np.unique(df[groupby_var]).tolist(), colors[:len(vals)])})
# 使用plt.title函数设置图形标题,其中包括变量名和分组变量名。使用plt.xlabel和plt.ylabel函数分别设置x轴和y轴的标签。使用plt.ylim函数设置y轴的取值范围。使用plt.xticks函数设置x轴刻度的位置和标签,并进行一些旋转和对齐操作。
plt.title(f"Stacked Histogram of ${x_var}$ colored by ${groupby_var}$", fontsize=22)
plt.xlabel(x_var)
plt.ylabel("Frequency")
plt.ylim(0, 40)
# plt.xticks(ticks=bins, labels=np.unique(df[x_var]).tolist(), rotation=90, horizontalalignment='left')
plt.xticks(rotation=90, horizontalalignment='left')
plt.show()
- 运行结果为:
4.3 Density Plot
4.4 Density Curves with Histogram
4.5 Joy Plot
4.6 Distributed Dot Plot
4.7 Box Plot
4.8 Dot + Box Plot
4.9 Violin Plot
4.10 Population Pyramid
4.11 Categorical Plots
References
- Top 50 matplotlib Visualizations
- 【Matplotlib作图-1.Correlation】50 Matplotlib Visualizations, Python实现,源码可复现
- 【Matplotlib作图-2.Deviation】50 Matplotlib Visualizations, Python实现,源码可复现
- 【Matplotlib作图-3.Ranking】50 Matplotlib Visualizations, Python实现,源码可复现