Python 数据可视化:seaborn 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, 社会心理学,认知心理学,行为科学,民族意志学 各种专栏后续疯狂补充。

  欢迎评论与私信交流!

发布了37 篇原创文章 · 获赞 25 · 访问量 4396

猜你喜欢

转载自blog.csdn.net/weixin_43329700/article/details/104333420
今日推荐