@[toc]
热力图 heatmap
热力图就是将矩形数据绘制为颜色编码矩阵。
numpy数组绘制热力图
import numpy as np; #np.random.seed(0)
import seaborn as sns; #sns.set()
uniform_data = np.random.rand(10, 12)
#print(uniform_data)
ax = sns.heatmap(uniform_data)
更改默认的colormap范围
ax = sns.heatmap(uniform_data, vmin=0, vmax=1)
使用发散色图绘制以 0 为中心的数据的热力图
normal_data = np.random.randn(10, 12)
ax = sns.heatmap(normal_data, center=0)
使用特定的行和列标签绘制 dataframe
flights = sns.load_dataset("flights")
flights = flights.pivot("month", "year", "passengers")
ax = sns.heatmap(flights)
year 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960
month
Jan 112 115 145 171 196 204 242 284 315 340 360 417
Feb 118 126 150 180 196 188 233 277 301 318 342 391
Mar 132 141 178 193 236 235 267 317 356 362 406 419
Apr 129 135 163 181 235 227 269 313 348 348 396 461
May 121 125 172 183 229 234 270 318 355 363 420 472
Jun 135 149 178 218 243 264 315 374 422 435 472 535
Jul 148 170 199 230 264 302 364 413 465 491 548 622
Aug 148 170 199 242 272 293 347 405 467 505 559 606
Sep 136 158 184 209 237 259 312 355 404 404 463 508
Oct 119 133 162 191 211 229 274 306 347 359 407 461
Nov 104 114 146 172 180 203 237 271 305 310 362 390
Dec 118 140 166 194 201 229 278 306 336 337 405 432
使用整数格式的数字值注释每个小单元格
ax = sns.heatmap(flights, annot=True, fmt="d")
在每个单元格之间添加线
ax = sns.heatmap(flights, linewidths=.5)
使用不同的 colormap
ax = sns.heatmap(flights, cmap="YlGnBu")
将 colormap 置于特定值的中心
ax = sns.heatmap(flights, center=flights.loc["Jan", 1955])
绘制每个其他列标签,而不绘制行标签
data = np.random.randn(50, 20)
ax = sns.heatmap(data, xticklabels=2, yticklabels=False)
在不同的坐标轴方向绘制颜色条
grid_kws = {"height_ratios": (.9, .05), "hspace": .4}
f, (ax, cbar_ax) = plt.subplots(2, gridspec_kw=grid_kws)
ax = sns.heatmap(flights, ax=ax,
cbar_ax=cbar_ax,
cbar_kws={"orientation": "horizontal"})
使用遮罩绘制矩阵中的一部分
corr = np.corrcoef(np.random.randn(10, 200))
mask = np.zeros_like(corr)
mask[np.triu_indices_from(mask)] = True
with sns.axes_style("white"):
ax = sns.heatmap(corr, mask=mask, vmax=.3, square=True)
聚类热图 clustermap
import seaborn as sns; sns.set(color_codes=True)
iris = sns.load_dataset("iris")
species = iris.pop("species")
g = sns.clustermap(iris)
使用不同的相似性指标
g = sns.clustermap(iris, metric="correlation")
使用不同的色彩映射并忽略色彩映射限制中的异常值
g = sns.clustermap(iris, cmap="mako", robust=True)
添加彩色标签
lut = dict(zip(species.unique(), "rbg"))
row_colors = species.map(lut)
g = sns.clustermap(iris, row_colors=row_colors)
散点图 scattermap
绘制一个两个变量的简单散点图
import seaborn as sns; sns.set()
import matplotlib.pyplot as plt
tips = sns.load_dataset('tips')
ax = sns.scatterplot(x='total_bill',y='tip',data=tips)
通过其他的变量分组并且用不同的颜色展示分组
ax = sns.scatterplot(x='total_bill',y='tip',hue='time',data=tips)
一个类别变量不同的大小,用不同的颜色
ax = sns.scatterplot(x='total_bill',y='tip',hue='day',size='smoker',
palette='Set2',data=tips)
箱型图 boxplot
箱形图(或盒须图)以一种利于变量之间比较或不同分类变量层次之间比较的方式来展示定量数据的分布。图中矩形框显示数据集的上下四分位数,而矩形框中延伸出的线段(触须)则用于显示其余数据的分布位置,剩下超过上下四分位间距的数据点则被视为“异常值”。
绘制一个单独的横向箱型图
import seaborn as sns
sns.set(style="whitegrid")
tips = sns.load_dataset("tips")
ax = sns.boxplot(x=tips["total_bill"])
根据分类变量分组绘制一个纵向的箱型图
ax = sns.boxplot(x="day", y="total_bill", data=tips)
使用 swarmplot() 展示箱型图顶部的数据点
ax = sns.boxplot(x="day", y="total_bill", data=tips)
ax = sns.swarmplot(x="day", y="total_bill", data=tips, color=".25")
提琴图 violinplot
小提琴图的功能与箱型图类似。 它显示了一个(或多个)分类变量多个属性上的定量数据的分布,从而可以比较这些分布。与箱形图不同,其中所有绘图单元都与实际数据点对应,小提琴图描述了基础数据分布的核密度估计。
小提琴图可以是一种单次显示多个数据分布的有效且有吸引力的方式,但请记住,估计过程受样本大小的影响,相对较小样本的小提琴可能看起来非常平滑,这种平滑具有误导性。
绘制一个单独的横向小提琴图
import seaborn as sns
sns.set(style="whitegrid")
tips = sns.load_dataset("tips")
ax = sns.violinplot(x=tips["total_bill"])
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
.. ... ... ... ... ... ... ...
239 29.03 5.92 Male No Sat Dinner 3
240 27.18 2.00 Female Yes Sat Dinner 2
241 22.67 2.00 Male Yes Sat Dinner 2
242 17.82 1.75 Male No Sat Dinner 2
243 18.78 3.00 Female No Thur Dinner 2
根据分类变量分组绘制一个纵向的小提琴图
ax = sns.violinplot(x="day", y="total_bill", data=tips)