不同场景适合的可视化图表类型,使用注意事项,以及如何用现成的绘图接口来呈现。 我们将常见的场景分为5大类:
1)展示趋势变化(Evolution)
2)展示分布关系(Distribution)
3)展示相关关系(Correlation)
4)展示排序信息(Ranking)
5)展示组成关系(Part of a whole)
一、展示趋势变化(Evolution)
1. 折线图 - Line chart
-
线图(也叫折线图)是众多图表中的基本图形。它由一系列的数据点和连接这些数据点的线段组成。
-
它的形式和散点图类似,区别是
①线图的数据点通常是有序排列的(一般按X轴的值顺序)
②线图多了线段连接数据点。
③线图是描述趋势变化的,散点图是描述两个变量的相关性的。 -
线图常用来呈现时间趋势的变化(时间序列),所以X轴通常代表某个时间间隔。
-
注意事项
- X轴的数据必须是有序的
- 是否需要截断Y轴,即Y轴是否必须要从0点开始?
- 如果要比较两个或多个不同的变量的变化趋势,不要使用双Y轴图表
- 小心有很多线条的线图(spaghetti chart-意大利面条图),太多的线条会让图表变得混乱、无法阅读;建议使用多子图形式或重点突出某一个种类
- 线图可以直接用
pyplot.plot函数绘制,只输入一列数的话会默认为Y轴的值,然后自动生成X轴;亦可输入两列数分别代表X轴和Y轴。
2.面积图 - Area chart
-
面积图和折线图从形式上看,非常相似。区别只是面积图在折线图的基础上,填充了折线下面的区域。可以用颜色或阴影去填充。
有很多人钟情于面积图,因为区域的填充可以让人更直观的看出数据的变化趋势。 -
注意事项
-
是否要截断Y轴,见折线图部分。
-
如果需要对比两个或以上的类别,建议使用堆积面积图;如果一定要在单一面积图上表示,注意填充颜色一定要是透明色的,可以看到所有的线条。
-
注意图形的长宽比,让图形更易读一点。
-
一个好的做法是,将线条和填充的颜色保持统一,填充的颜色设置一些透明度,这些的图形会更美观一点。
-
面积跟折线图作图非常类似,我们只需多一步填充的操作。
-
在python中,可以用
fill_between和stackplot来实现。 -
这里更推荐使用
fill_between,在之后的定制化操作中更方便一点;stackplot更多的是用在堆积面积图中。 -
fill_between和stackplot的输入都是两个数值变量。
-
# 导入包
import numpy as np
import matplotlib.pyplot as plt
# 创建数据
x=range(1,15)
y=[1,4,6,7,4,9,3,2,4,1,5,4,8,7]
# 绘图
# facecolor:控制填充颜色,red/skyblue/blue 等
# alpha: 控制填充透明度
# hatch: 控制阴影式样{'/', '\', '|', '-', '+', 'x', 'o', 'O', '.', '*'}
plt.fill_between( x, y, facecolor="skyblue", alpha=0.4, hatch='/')
plt.show()
# 在填充的基础上,添加一条折线,图形更加清晰
plt.fill_between( x, y, facecolor="skyblue", alpha=0.2)
plt.plot(x, y, color="skyblue", alpha=0.6, linewidth=1.5) # 线的更多设置可以参考 line plot文档
plt.show()

3. 堆积面积图 - Stacked area chart
- 堆积面积图是基础面积图的一个延伸,它将多个类别的数据变化都显示在了一个图形中。
- 它有以下特点:
- 不同于多折线图的线条可能相互交叉,堆积面积图不会出现不同分类的数据点被遮盖、被隐藏的状况。每个类别都是都是堆积在下面类别面积图之上的。
- 堆积面积图与标准面积图不同,某一分类的值并非与纵坐标完全对应,而是通过折线之间的相对高度来表达。
- 堆积面积图不仅可以展示各类的发展趋势(面积图和折线图都能表示这个), 可以表达总体的发展趋势和个种类间的关系,比如重要程度,大致占比等。
- 堆积图可以用
stackplot函数绘制,它的数据输入方式可以是一个X和多个Y,也可以将多列Y的数据合并成一个.
# library
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('seaborn-darkgrid') # 风格
plt.figure(figsize=(10, 6)) # 画布大小
# 方式一, y由三个序列组成
x=range(1,6)
y=[ [1,4,6,8,9], [2,2,7,10,12], [2,8,5,10,6] ]
# 绘图
plt.stackplot(x,y, labels=['A','B','C'])
plt.legend(loc='upper left')
plt.show()

二、展示分布关系(Distribution)
1.小提琴图 - Violin plot
-
小提琴图是用来展示多组数据的分布状态以及概率密度。这种图表结合了箱形图和密度图的特征。小提琴图的功能与箱型图类似。 它显示了一个(或多个)分类变量多个属性上的定量数据的分布,从而可以比较这些分布。与箱形图不同,其中所有绘图单元都与实际数据点对应,小提琴图描述了基础数据分布的核密度估计。
-
注意事项
1.不适合展示只有很少组别的数据
2.按照中位数排序能让数据看起来更直观 -
小提琴图可以用
seaborn包的violinplot方法实现.
import seaborn as sns
df = pd.read_csv('data/iris.csv')
#根据分类变量分组绘制一个纵向的小提琴图:
sns.violinplot( x=df['species'],y=df["sepal_length"],inner='quartile' )#x代表不同的类别特征,y代表连续特征,inner代表在小提琴图中显示四分位数线

2.箱型图 - Box plot
-
箱形图(或盒须图)以一种利于变量之间比较或不同分类变量层次之间比较的方式来展示定量数据的分布。矩形框显示数据集的上下四分位数,而矩形框中延伸出的线段(触须)则用于显示其余数据的分布位置,剩下超过上下四分位间距的数据点则被视为“异常值”。
-
箱型图的基本作用如下:
- 数据异常值
箱形图为我们提供了识别异常值的一个标准:异常值被定义为小于Q1-1.5IQR或大于Q3+1.5IQR的值。 - 偏态和尾重
箱型图揭示了数据批分布偏态和尾重的部分信息,尽管它们不能给出偏态和尾重程度的精确度量,但可作为我们粗略估计的依据。 - 数据的形状
同一数轴上,几批数据的箱形图并行排列,几批数据的中位数、尾长、异常值、分布区间等形状信息便一目了然。在一批数据中,哪几个数据点出类拔萃,哪些数据点表现不及一般,这些数据点放在同类其它群体中处于什么位置,可以通过比较各箱形图的异常值看出。
- 数据异常值
-
注意事项
1.箱型图隐藏了每个分组的数据量信息,可以通过标注或箱子宽度来展现
2.箱型图隐藏了背后的分布信息,当数据量较少时可以使用数据抖动(jitter),当数据量较大时可以使用小提琴图来展现 -
箱型图可以直接使用
seaborn的boxplot方法来实现。
import seaborn as sns
sns.set(style="whitegrid")
tips = pd.read_csv('data/tips.csv')
#根据分类变量分组绘制一个纵向的箱型图
ax = sns.boxplot(x="day", y="total_bill", data=tips)

3.直方图(HIstogram)
-
直方图只能接收数值类型的变量数据,该变量被切割成几个箱子,每个箱子的高度代表处于分箱中的数量。
-
注意事项
1.使用过程中要注意分箱数量的选择
2.不要用直方图展示超过5个变量的分布情况
3.避免使用彩色 -
可以使用
seaborn中的histplot方法绘制直方图
import pandas as pd
from sklearn.datasets import load_boston
boston=load_boston()
y = boston['target']
f, axs = plt.subplots(3,1,figsize=(10,10))
# 计数标准直方图
sns.histplot(y,stat='count',ax=axs[0])
# 归一化的直方图
sns.histplot(y,stat='probability',ax=axs[1])
# 在直方图上同时画出密度曲线
sns.histplot(y,stat='probability',kde=True,ax=axs[2])

4.密度图(Density)
-
密度图和直方图很类似,同样用来展示数值型变量的分布情况
-
注意事项
1.注意密度函数的带宽
2.不要用直方图展示超过5个变量的分布情况
3.避免使用彩色 -
可以使用
seaborn中的kdeplot方法绘制直方图
#kdeplot()中的bw参数控制着估计值与真实数据之间的贴近程度
#它与我们的KDE图的宽度相关。它提供了默认的规则来确定一个取值
x = np.random.normal(size=100)
sns.kdeplot(x, label="bw: default")
sns.kdeplot(x, bw_method=0.2, label="bw: 0.2")
sns.kdeplot(x, bw_method=2, label="bw: 2")
plt.legend();

2268

被折叠的 条评论
为什么被折叠?



