用seaborn画图文字怎么旋转,比如boxplot之类的,x轴标签可以旋转吗

机器学习(99)
June 10, 2015
由于之前草率的使用了ipython默认导出的markdown, 导致格式还是显示效果不佳. 于后期作了调整
Seaborn简介在此不多言, 只是强调它是在matplotlib基础上作了一系列改进.绘图流程简单, 图形美观, 官方文档也清晰直白.
这篇文章就是笔者在学习入门篇时的整理笔记.
%matplotlib inline
# 常用包的函数
import seaborn as sns
import numpy as np
from numpy.random import randn
import matplotlib as mpl
import matplotlib.pyplot as plt
from scipy import stats
# style set 这里只是一些简单的style设置
# set_palette是设置绘图颜色板的函数;
# set_context则是生成一个临时的绘图环境, 通过传递用户自定义的rc参数来修改.
##### 比如figure.figsize用于控制figure尺寸
sns.set_palette('deep', desat=.6)
sns.set_context(rc={'figure.figsize': (8, 5) } )
np.random.seed(1425)
为什么要从distribution开始?
当数据集过于复杂, 对应的分析需求也随之多样化. 从数据分析的角度来讲, 刚一开始就有可能陷入一个选择分析工具的泥潭. 而忽略了对基本数据的预先认识, distribution是对categorical \ quantatitive data的基本切入点.
最简单的hist (直方图)
Histogram几乎是对于连续型变量的分布图形, 通过横轴xticks指定了若干个等间距的区间对原数据进行分装, 达到分组统计(计数, 均值, 标准差, 等).
最简单的hist形式是使用一列数据(如pandas.series)作为输入, 也不用考虑其它的参数, seaborn将会用默认的bins, palette展示.
data = randn(75)
plt.hist(data)
为了让图形更简单, 这里先只展示了各bins.
hist支持的参数, 画出别样的风采
设置hist-bins的个数的参数为&bins, 颜色参数为color, alpha是透明度参数(这里单图形可省略).
data = randn(100)
plt.hist(data, bins=12, color=sns.desaturate(&indianred&, .8), alpha=.4)
双样本的hist图
以上数据来自于单样本(one-sample), 样本数增多时融合在一起的图形要考虑它们的各自参数.
data1 = stats.poisson(2).rvs(100)
data2 = stats.poisson(5).rvs(500)
max_data = np.r_[data1, data2].max()
bins = np.linspace(0, max_data, max_data+1)
# 首先将2个图形分别画到figure中
plt.hist(data1, bins,
color=&#FF0000&, alpha=.9)
plt.figure()
plt.hist(data2, bins, color=&#C1F320&, alpha=.5)
# 观察下面图形 可以看出nomed参数的作用 --
# 首先还是各自绘出自己的分布hist, 然后将二者重合部分用第三颜色加以区别.这样便于比较两个样本分布间的差异或相似程度.
plt.hist(data1, bins, normed=True, color=&#FF0000&, alpha=.9)
plt.hist(data2, bins, normed=True, color=&#C1F320&, alpha=.5)
hist 其它参数
x = stats.gamma(3).rvs(5000);
#plt.hist(x, bins=80) # 每个bins都有分界线
# 若想让图形更连续化 (去除中间bins线) 用histtype参数
plt.hist(x, bins=80, histtype=&stepfilled&, alpha=.8)
histtype 不光是在这里控制外观的参数, 在后面还能用来生成更复杂的histgram.
&联合分布& - jointplot
上面的多总体hist 还是独立作图, 并没有将二者结合, 使用jointplot就能作出联合分布图形, 即, x总体和y总体的笛卡尔积张成的二维平面.
不过jointplot要限于两个等量总体(len(data1) = len(data2) ) .
对于两个连续型变量, jointplot还是非常实用的, 对于两个连续型变量的分布情况, 集中趋势能非常简单的给出.
# 比如下面这个例子, x, y 是不同gamma分布的样本
# 注, jointplot 也要指定参数kind
# hex 可理解为&栅格&
x = stats.gamma(2).rvs(5000)
y = stats.gamma(50).rvs(5000)
with sns.axes_style(&dark&):
sns.jointplot(x, y, kind=&hex&)
# 下面用使用真实一点的数据作个dmeo
import pandas as pd
from pandas import read_csv
df = read_csv(&test.csv&, index_col='index')
# df 是一个测试数据
department
month_repay
apply_amont
month_repay_real
tst_amount
salary_net
clean_df = df[df['salary_net'] & 10000]
sub_df = pd.DataFrame(data=clean_df, columns=['salary_net', 'month_repay'] )
with sns.axes_style(&dark&):
sns.jointplot('salary_net', 'month_repay', data=sub_df, kind=&hex&)
plt.ylim([0, 10000])
plt.xlim([0, 10000])
another example
seaborn提供了几个经典数据集, dataset文件可见于
tips = sns.load_dataset('tips')
sns.jointplot(&total_bill&, &tip&, tips);
plt.figure()
sns.jointplot(&total_bill&, &tip&, tips, kind=&hex&, color=&#8855AA&)
plt.title(u'六角格')
这才发现格子并不是一个正方形, 而是正六边形的, 这也是kind=hex的真正作用, hex是六边形hexagon的简写.
注: jointplot除了作图, 还会给出x, y的相关系数(pearson_r) 和r = 0 的假设检验p值, 在图形的右上角.
下面来看有意思的kde & rug: kdeplot, rugplot
rugplot 是比Histogram更加直观的 &Histogram&, 因为上述的Hist图形是把同属在一个bin中的数据拧在一起输出, rugplot则不然, 将这个bin中各数据像小鬃毛一样画了出来, 所以我有时也管它叫鬃毛图.
data = randn(80)
plt.hist(data, alpha=0.3, color='#ffffff')
# 如不加新figure, 后续图形是会盖在原始图形上面.
sns.rugplot(data)
demo of rugplot1, with bell-curve
# 下面的图看上去复杂, 不过一步步拆解之后就易理解了
# 从一个样本点生成一个bell-curve
# 对比rug密集和bell密集的区域, 就是原始数据的局部集中的hot area.
sns.rugplot(data, color='indianred')
# xx 是用来画bell.
xx = np.linspace(-4, 4, 100)
# 计算bandwidth # 小bell的大小, 样本点控制中心线位置
bandwidth = ( (4*data.std() ** 5)/(3 *len(data))) ** .2
bandwidth = len(data) ** (-1. /5)
print bandwidth
kernels = []
for d in data:
# basis function as a gaussian PDF
kernel = stats.norm(d, bandwidth).pdf(xx)
kernels.append(kernel)
# Scale for plotting
kernel /= kernel.max()
kernel *= .4
plt.plot(xx, kernel, &#888888&, alpha=.18)
plt.ylim(0, 1)
demo of rugplot2
# example 2
f, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
# color_palette
&调色盘&参数
c1, c2 = sns.color_palette(&husl&, 3)[:2]
# summed kde
summed_kde = np.sum(kernels, axis=0)
# 将上面制造出来的若干kde累加起来
ax1.plot(xx, summed_kde, c=c1)
sns.rugplot(data, c=c1, ax=ax1)
ax1.set_title(&summed basis function&)
# density estimate
# 下图是画出原数据对应的高斯核函数
scipy_kde = stats.gaussian_kde(data)(xx)
ax2.plot(xx, scipy_kde, c=c2)
sns.rugplot(data, c=c2, ax=ax2)
ax2.set_yticks([]) # no ticks of y
ax2.set_title(&scipy gaussian_kde&)
f.tight_layout()
借助上面两个demo, 就能理解kdeplot的作用了
kde是核密度函数估计的简写, 根据一个现有的样本数据来估计原来的整体分布的密度曲线.
sns.kdeplot(data, shade=True)
# 比较bw(bandwidth) 作用
pal = sns.blend_palette([sns.desaturate(&royalblue&, 0), &royalblue&], 5)
bws = [.1, .25, .5, 1, 2]
for bw, c in zip(bws, pal):
sns.kdeplot(data, bw=bw, color=c, lw=1.8, label=bw)
plt.legend(title=&kernel bandwidth value&)
sns.rugplot(data, color=&#CF3512&)
# 比较不同的kernels
kernels = [&biw&, &cos&, &epa&, &gau&, &tri&, &triw&]
for k, c in
zip(kernels, pal):
sns.kdeplot(data, kernel=k, color=c, label=k)
plt.legend()
# cut, clip 参数用于对outside data ( data min左, max右) 的预测 填充
with sns.color_palette('Set2'):
f, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 8), sharex=True)
for cut in[4, 3, 2]:
sns.kdeplot(data, cut=cut, label=cut, lw=cut*1.5, ax=ax1)
for clip in[1, 2, 3]:
sns.kdeplot(data, clip=(-clip, clip), label=clip, ax=ax2)
# 利用kdeplot来确定两个sample data 是否来自于同一总体
f, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(8, 6))
c1, c2, c3 = sns.color_palette('Set1', 3)
dist1, dist2, dist3 = stats.norm(0, 1).rvs((3, 100))
dist3 = pd.Series(dist3 + 2, name='dist3')
# dist1, dist2是两个近似正态数据, 拥有相同的中心和摆动程度
sns.kdeplot(dist1, shade=True, color=c1, ax=ax1)
sns.kdeplot(dist2, shade=True, color=c2, label='dist2', ax=ax1)
# dist3 分布3 是另一个近正态数据, 不过中心为2.
sns.kdeplot(dist1, shade=True, color=c2, ax=ax2)
sns.kdeplot(dist3, shade=True, color=c3, ax=ax2)
# kdeplot是密度图.
# 对概率密度统计熟悉的人还会想到的是累积密度图
# kdeplot 参数 cumulative
with sns.color_palette(&Set1&):
for d, label in zip(data, list(&ABC&)):
sns.kdeplot(d, cumulative=True, label=label)
# vertical 参数 把刚才的图形旋转90度
plt.figure(figsize=(4, 8))
data = stats.norm(0, 1).rvs((3, 100)) + np.arange(3)[:, None]
with sns.color_palette(&Set2&):
for d, label in zip(data, list(&ABC&)):
sns.kdeplot(d, vertical=True, shade=True, label=label)
# plt.hist(data, vertical=True)
# error vertical不是每个函数都具有的
多维数据的kdeplot
data = np.random.multivariate_normal([0, 0], [[1, 2], [2, 20]], size=1000)
data = pd.DataFrame(data, columns=[&X&, &Y&])
mpl.rc(&figure&, figsize=(6, 6))
sns.kdeplot(data)
# 更多的还是用来画二维数据的density plot
sns.kdeplot(data.X, data.Y, shade=True, bw=&silverman&, gridsize=50, clip=(-11, 11))
# gridsize参数用来指定grid尺寸
# cut clip 参数类似之前提到过的
# cmap则是用来color map映射, 相当于一个color小帽子(mask)
sns.kdeplot(data.X, data.Y, shade=True, bw=&silverman&, gridsize=50, clip=(-11, 11),
cmap=&BuGn_d&)
sns.kdeplot(data.X, data.Y, shade=True, bw=&silverman&, gridsize=50, clip=(-11, 11),
cmap=&Purples&)
好了. 那再让我来回来想想jointplot
之前jointplot用了 kind=hex, 那么当见过了kde核函数分布图后, 可以把这二者结合到一起.
with sns.axes_style('white'):
sns.jointplot('X', 'Y', data, kind='kde')
hist增强版 - distplot
hist的作图哲学(分组,装箱), 看上去其实有些连续数据离散化的感觉. 这种分组会造成原始数据的连续性信息变得缺失.
若希望保留此信息另外绘制分布趋势就是sns的distplot函数.
# distplot 简版就是hist 加上一根density curve
sns.set_palette(&hls&)
mpl.rc(&figure&, figsize=(9, 5))
data = randn(200)
sns.distplot(data)
# 当然慢慢地就发现distplot的功能, 远比hist强大.
sns.distplot(data, kde=True, rug=True, hist=True)
# 更细致的, 来用各kwargs来指定 (参数的参数dict)
sns.distplot(data, kde_kws={&color&: &seagreen&, &lw&:3, &label& : &KDE& },
hist_kws={&histtype&: &stepfilled&, &color&: &slategray& })
我想distplot还有很多等待着你我去挖掘.
好了. 可能你在等待boxplot的名字很久了: boxplot 与 violinplot
boxplot, 连续数据的另一种分布式描述. 以five - figures作为大概的集中趋势, 离散趋势的统计量.
violinplot是与之类似, 它是在boxplot基础上增加了density curve (也就是&小提琴&的两侧曲线)
A violin plot is a method of plotting numeric data. It is a box plot with a rotated kernel density plot on each side.[1]
more info at&
# first 先来看boxplot
sns.set(rc={&figure.figsize&: (6, 6)})
data = [randn(100), randn(120) + 1.5]
plt.boxplot(data)
# 这是一个简单版&dataframe&, 由两列不等长的series(array)组成, 没有index columns所以在图中默认用1,2,3代替
# 上面的图形是mpl module画出来的, 比较&ugly&
# 来看看seaborn画出来的样貌
sns.boxplot(data)
# 当然, 如果可以, 最好我们能指定两组分布更多的信息
# 比如命名左边的box, 右边的box
sns.boxplot(data, names=['left', 'right'], whis=np.inf, color='indianred')
boxplot其它参数demo
sns.boxplot(data, names=['down', 'up'],linewidth=2, widths =.5, vert=False, color='slategray')
# join_rm 参数 rm 是指 repeated-measures data 重复观测
# 为了彰显重复观测的效应, 可使用join_rm参数==True
pre = randn(25)
post = pre+ np.random.rand(25)
sns.boxplot([pre, post], names=[&left&, &right&], color=&coral&, join_rm =True)
# 下面介绍violinplot, 而且是从boxplot开始讲起.
# 这也是非常喜欢这个module(作者)的原因, 很合我的味口
d1 = stats.norm(0, 5).rvs(100)
d2 = np.concatenate([stats.gamma(4).rvs(50), -1 * stats.gamma(4).rvs(50) ])
data = pd.DataFrame(dict(d1=d1, d2=d2))
sns.boxplot(data, color=&pastel&, widths=.5)
# 看上面两个boxplot 分布是很接近的, 但有多像? 无法定量
# 简单的boxplot是定性的描述, 用来比较时更不能定量比较相似程度
sns.violinplot(data, color=&pastel&)
# 这个时候 2个sample分布就不像了...
# boxplot violinplot 常常用来 比较 一个分组(离散) X 一个连续变量的各组差异
# 因此若有DataFrame结构, 要尽量学着使用groupby操作.
y = np.random.randn(200)
g = np.random.choice(list('abcdef'), 200)
for i, l in enumerate('abcdef'):
y[g == l] += i // 2
df = pd.DataFrame(dict(score=y, group=g))
sns.boxplot(df.score, df.group)
# 到最后, 我看到了作者用到了我特别喜欢的一个词 tune(校正,
# violinplot 就相当于是对boxplot一个tuning的过程, 哦, 想到了老罗.
sns.violinplot(df.score, df.group, color=&Paired&, bw=1)
# 关于names(组名称list), 默认的画图顺序是 array顺序, 也能额外用order参数指定
order = list('cbafed')
sns.boxplot(df.score, df.group, order=order, color='PuBuGn_d')
在复杂的violinplot基础上再tune一点
# 使用参数 inner
# inner : {‘box’ | ‘stick’ | ‘points’}
# Plot quartiles or individual sample values inside violin.
y = np.random.randn(200)
g = np.random.choice(list(&abcdef&), 200)
for i, l in enumerate(&abcdef&):
y[g == l] += i // 2
df = pd.DataFrame(dict(score=y, group=g))
sns.boxplot(df.score, df.group);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:19305次
排名:千里之外
转载:137篇
(7)(2)(6)(3)(3)(11)(21)(14)(11)(13)(5)(20)(23)数据可视化(三)- Seaborn简易入门
本文内容来源:https://www.dataquest.io/mission/133/creating-compelling-visualizations
本文数据来源:http://www.cdc.gov/nchs/nsfg.htm
本文摘要:介绍一个以matplotlib为底层,更容易定制化作图的库Seaborn
Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn就能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。应该把Seaborn视为matplotlib的补充,而不是替代物。
安装seaborn的方法
pip install seaborn原始数据展现(这是一份家庭调查的数据,preglngth - 怀孕周长, birthord - 孕妇的第几个孩子, birthwgt_lb1 - 婴儿重量(单位:磅), birthwgt_oz1 - 婴儿重量(单位:盅司), agepreg - 孕妇在分娩时的年龄)
import pandas as pdbirths = pd.read_csv('births.csv')直方图在上一篇文章中已经使用过pandas.DataFrame.hist()来制作直方图了,现在用seaborn.distplot()来制作直方图,观察之间的差异
# 对上表的prglngth列做一个直方图import matplotlib.pyplot as pltimport seaborn as sns #要注意的是一旦导入了seaborn,matplotlib的默认作图风格就会被覆盖成seaborn的格式%matplotlib inline
# 为了在jupyter notebook里作图,需要用到这个命令sns.distplot(births['prglngth'])sns.plt.show()可以看到与使用matplotlib作的直方图最大的区别在于有一条密度曲线(KDE),可以通过设置参数去掉这条默认的曲线
sns.distplot(births['prglngth'], kde=False)sns.plt.show() 那么Pandas与Seaborn之间有什么区别呢?其实两者都是使用了matplotlib来作图,但是有非常不同的设计差异
在只需要简单地作图时直接用Pandas,但要想做出更加吸引人,更丰富的图就可以使用Seaborn
Pandas的作图函数并没有太多的参数来调整图形,所以你必须要深入了解matplotlib
Seaborn的作图函数中提供了大量的参数来调整图形,所以并不需要太深入了解matplotlib
Seaborn的API:https://stanford.edu/~mwaskom/software/seaborn/api.html#style-frontend 
# 对上图进行更多的配置sns.set_style('dark')
# 该图使用黑色为背景色sns.distplot(births['prglngth'], kde=False) # 不显示密度曲线sns.axlabel('Birth number', 'Frequency') # 设置X轴和Y轴的坐标含义sns.plt.show() 箱型图
# 以birthord作为x轴,agepreg作为y轴,做一个箱型图sns.boxplot(x='birthord', y='agepreg', data=births)sns.plt.show() 多变量作图seaborn可以一次性两两组合多个变量做出多个对比图,有n个变量,就会做出一个n × n个格子的图,譬如有2个变量,就会产生4个格子,每个格子就是两个变量之间的对比图
var1  vs  var1
var1  vs  var2
var2  vs  var1
var2  vs  var2相同的两个变量之间(var1  vs  var1 和 var2  vs  var2)以直方图展示,不同的变量则以散点图展示(var1  vs  var2 和var2  vs  var1)要注意的是数据中不能有NaN(缺失的数据),否则会报错
sns.pairplot(births, vars=['agepreg', 'prglngth','birthord'])sns.plt.show()
最新教程周点击榜
微信扫一扫本文内容来源:
本文数据来源:
本文摘要:介绍一个以matplotlib为底层,更容易定制化作图的库Seaborn
Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn就能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。应该把Seaborn视为matplotlib的补充,而不是替代物。
安装seaborn的方法
pip install seaborn
原始数据展现(这是一份家庭调查的数据,preglngth - 怀孕周长, birthord - 孕妇的第几个孩子, birthwgt_lb1 - 婴儿重量(单位:磅), birthwgt_oz1 - 婴儿重量(单位:盅司), agepreg - 孕妇在分娩时的年龄)
import pandas as pd
births = pd.read_csv('births.csv')
在上一篇文章中已经使用过pandas.DataFrame.hist()来制作直方图了,现在用seaborn.distplot()来制作直方图,观察之间的差异
# 对上表的prglngth列做一个直方图
import matplotlib.pyplot as plt
import seaborn as sns #要注意的是一旦导入了seaborn,matplotlib的默认作图风格就会被覆盖成seaborn的格式
%matplotlib inline
# 为了在jupyter notebook里作图,需要用到这个命令
sns.distplot(births['prglngth'])
sns.plt.show()
可以看到与使用matplotlib作的直方图最大的区别在于有一条密度曲线(KDE),可以通过设置参数去掉这条默认的曲线
sns.distplot(births['prglngth'], kde=False)
sns.plt.show()
那么Pandas与Seaborn之间有什么区别呢?
其实两者都是使用了matplotlib来作图,但是有非常不同的设计差异
在只需要简单地作图时直接用Pandas,但要想做出更加吸引人,更丰富的图就可以使用Seaborn
Pandas的作图函数并没有太多的参数来调整图形,所以你必须要深入了解matplotlib
Seaborn的作图函数中提供了大量的参数来调整图形,所以并不需要太深入了解matplotlib
Seaborn的API:
# 对上图进行更多的配置
sns.set_style('dark')
# 该图使用黑色为背景色
sns.distplot(births['prglngth'], kde=False) # 不显示密度曲线
sns.axlabel('Birth number', 'Frequency') # 设置X轴和Y轴的坐标含义
sns.plt.show()
# 以birthord作为x轴,agepreg作为y轴,做一个箱型图
sns.boxplot(x='birthord', y='agepreg', data=births)
sns.plt.show()
多变量作图
seaborn可以一次性两两组合多个变量做出多个对比图,有n个变量,就会做出一个n × n个格子的图,譬如有2个变量,就会产生4个格子,每个格子就是两个变量之间的对比图
var1  vs  var1
var1  vs  var2
var2  vs  var1
var2  vs  var2
相同的两个变量之间(var1  vs  var1 和 var2  vs  var2)以直方图展示,不同的变量则以散点图展示(var1  vs  var2 和var2  vs  var1)
要注意的是数据中不能有NaN(缺失的数据),否则会报错
sns.pairplot(births, vars=['agepreg', 'prglngth','birthord'])
sns.plt.show()
阅读(...) 评论()Seaborn官方文档(中文版)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Seaborn官方文档(中文版)
上传于||文档简介
&&p​y​t​h​o​n​中​强​大​的​数​据​可​视​化​库​,​能​绘​制​出​高​品​质​的​图​表
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩2页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 画图 旋转 的文章

 

随机推荐