Python数据可视化库seaborn ------ 绘制直方图概率密度曲线;绘制多条曲线;设置主题风格;小提琴图;箱线图;绘制seaborn多个子图;调色板;
绘制数据的直方图及其概率密度曲线
这里可以使用 seaborn.displot() 来绘制,如果指定kde参数为False,就不会画概率密度曲线
1 import pandas as pd
2 import seaborn as sns
3 import matplotlib.pyplot as plt
4
5 titanic = pd.read_csv('seaborn_test\\train.csv')
6 cols = ['Survived', 'Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
7 titanic = titanic[cols].dropna()
8
9 sns.distplot(titanic['Age'])
10 plt.show()
运行结果:
下面展示没有概率密度曲线的直方图和用gamma拟合的概率密度曲线:
1 x = np.random.normal(size=100)
2 sns.distplot(x, kde=False) # kde 核密度估计
3 plt.show()
4 from scipy import stats, integrate
5 x = np.random.gamma(6, size=200)
6 sns.distplot(x, kde=False, fit=stats.gamma)
7 plt.show()
运行结果:
在一个画布上绘制多条曲线
1 def sinplot(flip=1):
2 x = np.linspace(0, 14, 100)
3 for i in range(1, 7):
4 plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)
5
6
7 sinplot()
8 plt.show()
运行结果:
我们可以恢复seaborn默认的画布
1 sns.set() # 恢复默认的格式
2 sinplot()
3 plt.show()
运行结果:
设置主题风格
这里有五种常用风格:darkgrid、whitegrid、dark、white、ticks
1 sns.set_style("whitegrid")
2 data = np.random.normal(size=(20, 6)) + np.arange(6) / 2
3 sns.boxplot(data=data)
4 plt.show()
5
6 sns.set_style("dark")
7 sinplot()
8 plt.show()
9
10 sns.set_style("white")
11 sinplot()
12 plt.show()
13
14 sns.set_style("ticks")
15 sinplot()
16 plt.show()
17
18 sinplot()
19 sns.despine()
20 plt.show()
绘制小提琴图
这种图表结合了箱形图和密度图的特征,主要用来显示数据的分布形状。中间的黑色粗条表示四分位数范围,
从其延伸的幼细黑线代表 95% 置信区间,而白点则为中位数。
1 data = np.random.normal(size=(20, 6)) + np.arange(6) / 2
2 # 小提琴图
3 sns.violinplot(data)
4 # offset=10 表示与轴线之间的距离;trim=True控制纵坐标方向的轴线
5 sns.despine(offset=10, trim=True) # 轴线的距离
6 plt.show()
7 sns.violinplot(data)
8 sns.despine(offset=5, trim=False) # 轴线的距离
9 plt.show()
运行结果:
绘制箱线图
1 sns.set_style("whitegrid")
2 sns.boxplot(data=data, palette="deep")
3 sns.despine(left=True)
4 plt.show()
5
6 sns.set_style("whitegrid")
7 sns.boxplot(data=data)
8 sns.despine(left=True)
9 plt.show()
两张图很明显是图的颜色不一样,其实参数 palette="deep" 是表示调用 “deep” 的调色板。
设置seaborn子图
1 def sinplot(flip=1):
2 x = np.linspace(0, 14, 100)
3 for i in range(1, 7):
4 plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)
5
6
7 with sns.axes_style("darkgrid"):
8 plt.subplot(211)
9 sinplot()
10 plt.subplot(212)
11 sinplot(-1)
12 plt.show()
运行结果:
如果我们想绘制2X2的一个多个子图画布,我们可以使用 plt.subplot(2,2,i) 来指定。
1 sns.axes_style("darkgrid")
2 plt.subplot(221)
3 sinplot(1)
4
5 sns.axes_style("dark")
6 plt.subplot(222)
7 sinplot()
8
9 sns.axes_style("ticks")
10 plt.subplot(223)
11 sinplot(-1)
12
13 plt.subplot(224)
14 sns.set_context("notebook", font_scale=1.5, rc={"lines.linewidth": 2.5})
15 sinplot()
16 plt.show()
运行结果:
set_context(context=None, font_scale=1, rc=None) 参数说明:context 有paper, notebook, talk, poster 这四个
预先设置的模板,font_scale为浮动参数,rc为参数映射字典,如:rc={"lines.linewidth": 2}。下面的案例将展示四种context
的效果。
1 plt.subplot(221)
2 sns.set_context("paper", font_scale=1.5)
3 sinplot(1)
4
5
6 plt.subplot(222)
7 sns.set_context("notebook", rc={"lines.linewidth": .5})
8 sinplot()
9
10
11 plt.subplot(223)
12 sns.set_context("talk", font_scale=1.5, rc={"lines.linewidth": 2.})
13 sinplot(-1)
14
15 plt.subplot(224)
16 sns.set_context("poster", font_scale=1.5, rc={"lines.linewidth": 2.5})
17 sinplot()
18 plt.show()
运行结果:
右图为除context其他参数一样的效果。context参数指定了风格,坐标轴对比明显。
调色板
颜色很重要
color_palette()能传入任何Matplotlib所支持的颜色;color_palette()不写参数则默认颜色
set_palette()设置所有图的颜色
分类色板
获取当前使用的默认色板:
1 current_palette = sns.color_palette()
2 # 获取当前调色板
3 sns.palplot(current_palette)
4 plt.show()
运行结果:
圆形画板
当你有10个以上的分类要区分时,最简单的方法就是在一个圆形的颜色空间中画出均匀间隔的颜色(这样的色调会
保持亮度和饱和度不变)。这是大多数的人当他们需要使用比当前默认颜色循环中设置的颜色更多时的默认方案。
最常用的方法是使用hls的颜色空间,这是RGB值的一个简单转换。
1 sns.palplot(sns.color_palette("hls", 12))
2 plt.show()
运行结果:
下面用箱线图展示效果:
1 data = np.random.normal(size=(20, 12)) + np.arange(12) / 2
2 sns.boxplot(data=data, palette=sns.color_palette("hls", 12))
3 plt.show()
运行结果:
hls_palette() 函数用下面的参数控制颜色的亮度和饱和
l - 亮度 lightness
s - 饱和 saturation
1 sns.palplot(sns.color_palette("hls", 12))
2 plt.show()
3 sns.palplot(sns.hls_palette(12, l=.7, s=.9))
4 plt.show()
使用xkcd颜色来命名颜色
xkcd包含了一套众包努力的针对随机RGB色的命名。产生了954个可以随时通过xdcd_rgb字典中调用
的命名颜色。
1 plt.plot([0, 1], [0, 1], sns.xkcd_rgb["pale red"], lw=3) # https://xkcd.com/color/rgb/
2 plt.plot([0, 1], [0, 2], sns.xkcd_rgb["medium green"], lw=3)
3 plt.plot([0, 1], [0, 3], sns.xkcd_rgb["denim blue"], lw=3)
4 plt.plot([0, 1], [0, 4], sns.xkcd_rgb["olive"], lw=5)
5 plt.show()
运行结果:
生成一个自定义调色板
1 colors = ["windows blue", "amber", "greyish", "faded green", "dusty purple"]
2 sns.palplot(sns.xkcd_palette(colors))
3 plt.show()
运行结果:
连续色板
色彩随数据变换,比如数据越来越重要则颜色越来越深
Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_r, Dark2,
Dark2_r, GnBu, GnBu_r, Greens, Greens_r, Greys, Greys_r, OrRd, OrRd_r, Oranges, Oranges_r, PRGn,
PRGn_r, Paired, Paired_r, Pastel1, Pastel1_r, Pastel2, Pastel2_r, PiYG, PiYG_r, PuBu, PuBuGn, PuBuGn_r,
PuBu_r, PuOr, PuOr_r, PuRd, PuRd_r, Purples, Purples_r, RdBu, RdBu_r, RdGy, RdGy_r, RdPu, RdPu_r,
RdYlBu, RdYlBu_r, RdYlGn, RdYlGn_r, Reds, Reds_r, Set1, Set1_r, Set2, Set2_r, Set3, Set3_r, Spectral,
Spectral_r, Vega10, Vega10_r, Vega20, Vega20_r, Vega20b, Vega20b_r, Vega20c, Vega20c_r, Wistia,
Wistia_r, YlGn, YlGnBu, YlGnBu_r, YlGn_r,YlOrBr, YlOrBr_r, YlOrRd, YlOrRd_r, afmhot, afmhot_r, autumn,
autumn_r,binary, binary_r, bone, bone_r, brg, brg_r, bwr, bwr_r, cool, cool_r, coolwarm,coolwarm_r,copper,
copper_r,cubehelix, cubehelix_r, flag, flag_r, gist_earth, gist_earth_r, gist_gray, gist_gray_r, gist_heat,
gist_heat_r, gist_ncar, gist_ncar_r, gist_rainbow, gist_rainbow_r, gist_stern, gist_stern_r, gist_yarg,
gist_yarg_r, gnuplot,gnuplot2, gnuplot2_r, gnuplot_r, gray, gray_r, hot, hot_r, hsv, hsv_r, icefire, icefire_r,
inferno, inferno_r, jet, jet_r, magma, magma_r, mako, mako_r, nipy_spectral, nipy_spectral_r, ocean,
ocean_r, pink, pink_r, plasma, plasma_r, prism, prism_r, rainbow, rainbow_r, rocket, rocket_r, seismic,
seismic_r, spectral, spectral_r, spring, spring_r, summer, summer_r, tab10, tab10_r, tab20, tab20_r,
tab20b, tab20b_r, tab20c, tab20c_r, terrain, terrain_r, viridis, viridis_r, vlag, vlag_r, winter, winter_r
测试面板:
1 sns.palplot(sns.color_palette("Blues"))
2 sns.palplot(sns.color_palette("Accent"))
3 plt.show()
注意:如果想要翻转渐变,可以在面板名称中添加一个_r后缀
cubehelix_palette()调色板
色调线性变换
1 sns.palplot(sns.color_palette("cubehelix", 8))
2 sns.palplot(sns.cubehelix_palette(8, start=.5, rot=-.75))
3 plt.show()
light_palette() 和dark_palette()调用定制连续调色板
1 sns.palplot(sns.light_palette("green"))
2 sns.palplot(sns.light_palette("navy", reverse=True))
3 sns.palplot(sns.light_palette((210, 90, 60), input="husl"))
4 plt.show()
运行结果: