本文已在公众号 “ 数据分析与商业实践 ” 首发。关注一下~,更多商业数据分析案例源码等你来撩。后台回复 “displot” ,即可获取本文的案例示范与包含详细注释的源数据与源代码!
引言
Python 的绘图功能非常强大,如果能将已有的绘图库和各种复杂操作汇总在一个自己写的库/包中,并实现一行代码就调用并实现复杂的绘图功能,那就更强大了。所以本博文只强调绘图代码的实现,绘图中的统计学知识(名义变量,数值变量,xx图与xx图的区别等等)与 Python 基础库操作(seaborn,matplotlib)并不会提及,不过也欢迎关注,后续会有更多更广更丰富的知识疯狂输出。
使用方法 & 实现效果
夸张了吧,上面的这个破图也好意思叫复杂绘图?可能会有不少朋友这样想,可以理解,下面来拆解一下知识点与呈现绘图代码。
宏观来看
- 图片大小怎么弄的
- x,y 轴的坐标我也没看你设置啊,怎么自动就标好了
- 图片的颜色还是蛮柔和的嘛,淡蓝色(废话,经典 R 语言的三配色淡蓝,浅紫,浅绿之一,美丽值大增)
- 同等条件的正态曲线怎么生成的?黑色对比起来也不错
细节来看
- 图例生成得恰到好处啊,位置摆放也不错
- 边框怎么隐去得这么完美,让我的视野更加聚焦了,欸左上右三边的边框都去掉了欸
- x 轴好像也不错,没有紧紧贴住图形,而是向下偏移了一点
- 背景的网格线让我能更好的比对数据了欸
纳米细节来看
- 我以前听说 seaborn 绘图在生成中文方面会有困难,有时候坐标轴如果是负数的话会生成 bug 框框,这个怎么解决呢?
- 整体绘图背景好像也可以调整,比如图中的是 seaborn 经典的白色网格底,好像还可以调成 R 语言绘图风格的 ggplot,其他阴影什么的
- 坐标轴,图例,标题等等的字体设置也有玄机,字号和样式的选择难道也不用设置嘛?
上面是我暂时所能想到的细节,其实都封装在自己写好绘图库 myplots 中了。但绘图代码并不是自己创作的,而是从前人和各种大神的代码中学习并积累下来的,为了画出一幅还比较完美的图,已经踩过无数的坑了。
代码展示!!
代码中的注释已经非常非常详细了!希望能够帮你规避画图中的各种坑
# ===================== 正态曲线比较 ========================
# 基础绘图库
import matplotlib.pyplot as plt
import seaborn as sns
# %matplotlib inline
# 各种细节配置如 文字大小,图例文字等杂项
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) # 设置 matplotlib 的各种参数
plt.style.use('seaborn-whitegrid') # seaborn 主题
sns.set_style("white")
plt.rc('font', **{'family': 'Microsoft YaHei, SimHei'}) # 设置中文字体的支持
# sns.set(font='SimHei') # 解决Seaborn中文显示问题,但会自动添加背景灰色网格
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
import scipy.stats as stats # 统计学库
from scipy.stats import norm # 用于拟合正态分布曲线
def norm_comparision_plot(data, figsize=(12, 10), color="#099DD9",
ax=None, surround=True, grid=True):
"""
function: 传入 DataFrame 指定行,绘制其概率分布曲线与正态分布曲线(比较)
color: 默认为标准天蓝 #F79420:浅橙 ‘green’:直接绿色(透明度自动匹配)
ggplot 经典三原色:'#F77B72':浅红, '#7885CB':浅紫, '#4CB5AB':浅绿
ax=None: 默认无需绘制子图的效果; surround:sns.despine 的经典组合,
默认开启,需要显式关闭
grid:是否添加网格线,默认开启,需显式关闭
"""
plt.figure(figsize=figsize) # 设置图片大小
# fit=norm: 同等条件下的正态曲线(默认黑色线);lw-line width 线宽
sns.distplot(data, fit=norm, color=color, \
kde_kws={"color" :color, "lw" :3 }, ax=ax)
(mu, sigma) = norm.fit(data) # 求同等条件下正态分布的 mu 和 sigma
# 添加图例:使用格式化输入,loc='best' 表示自动将图例放到最合适的位置
plt.legend(['Normal dist. ($\mu=$ {:.2f} and $\sigma=$ {:.2f} )'. \
format(mu, sigma)] ,loc='best')
plt.ylabel('Frequency')
plt.title("Distribution")
if surround == True:
# trim=True-隐藏上面跟右边的边框线,left=True-隐藏左边的边框线
# offset:偏移量,x 轴向下偏移,更加美观
sns.despine(trim=True, left=True, offset=10)
if grid == True:
plt.grid(True) # 添加网格线
后记
数据分析,商业实践,数据可视化,网络爬虫,统计学,Excel,Word, 社会心理学,认知心理学,行为科学,民族意志学 各种专栏后续疯狂补充。
欢迎评论与私信交流!