Python 绘制正态曲线:linespace 组合 matplotlib(放入自写库,一行代码实现复杂绘图)

在这里插入图片描述
  这是一个自写库系列,底部还有相关的骚操作快捷绘图的链接。不多说,已知 mu 和 sigma,一行代码实现复杂绘图,各种细节配置尽在不言中。

PS:这个图的具体用法在下面这个链接

统计学(一): Z 分数 & 正态分布 (附 Python 实现代码) --Z 检验先修; Z 分数与正态分布两者关系; Z 分数与百分位数的异同;面试要点(以心理学实验为舟)

在这里插入图片描述
  夸张了吧,上面的这个破图也好意思叫复杂绘图?可能会有不少朋友这样想,可以理解,下面来拆解一下知识点与呈现绘图代码。

宏观来看

  • 图片大小怎么弄的
  • x,y 轴的坐标我也没看你设置啊,怎么自动就标好了
  • 正态曲线怎么生成的?

细节来看

  • 图例生成得恰到好处啊,位置摆放也不错
  • 边框怎么隐去得这么完美,让我的视野更加聚焦了,欸左上右三边的边框都去掉了欸
  • x 轴好像也不错,没有紧紧贴住图形,而是向下偏移了一点
  • 背景的网格线让我能更好的比对数据了欸

纳米细节来看

  • 我以前听说 seaborn/matplotlib 绘图在生成中文方面会有困难,有时候坐标轴如果是负数的话会生成 bug 框框,这个怎么解决呢?
  • 整体绘图背景好像也可以调整,比如图中的是 seaborn 经典的白色网格底,好像还可以调成 R 语言绘图风格的 ggplot,其他阴影什么的
  • 坐标轴,图例,标题等等的字体设置也有玄机,字号和样式的选择难道也不用设置嘛?

  上面是我暂时所能想到的细节,其实都封装在自己写好绘图库 myplots 中了。但绘图代码并不是自己创作的,而是从前人和各种大神的代码中学习并积累下来的,为了画出一幅还比较完美的图,已经踩过无数的坑了,码下来后也可以自行改装,添加。

代码展示!!

 &emsp代码中的注释已经非常非常详细了!希望能够帮你规避画图中的各种坑

# 基础配置
# 基础库
import numpy as np
import pandas as pd

# 基础绘图库
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)
plt.style.use('seaborn-whitegrid')
sns.set_style("white")
plt.rc('font', **{'family': 'Microsoft YaHei, SimHei'})  # 设置中文字体的支持
# sns.set(font='SimHei')  # 解决Seaborn中文显示问题,但会自动添加背景灰色网格

plt.rcParams['axes.unicode_minus'] = False
# 解决保存图像是负号'-'显示为方块的问题

# 提高输出效率库
from IPython.core.interactiveshell import InteractiveShell # 实现 notebook 的多行输出
InteractiveShell.ast_node_interactivity = 'all' #默认为'last'
from IPython.display import Image # 插入图片包
# Image(filename="img/pythonl. png", width=400, height=400)

import math

####################### 绘制正态曲线 #######################
def normal_curve(mu, sigma, figsize=(10,8), despine=True):   
    """ 传入 x,均值 """
    #正态分布的概率密度函数。可以理解成 x 是 mu(均值)和 sigma(标准差)的函数
    def normfun(x, mu=mu, sigma=sigma):
        pdf = np.exp(-((x - mu)**2)/(2*sigma**2)) / (sigma * np.sqrt(2*np.pi))
        return pdf

    plt.figure(figsize=figsize)
    # Python实现正态分布
    # 绘制正态分布概率密度函数
    x = np.linspace(mu - 3*sigma, mu + 3*sigma, 50)
    y_sig = normfun(x=x, mu=mu, sigma=sigma)
    plt.plot(x, y_sig, "r-", linewidth=2) # 波形曲线

    # 添加垂直分隔线
    plt.vlines(mu, 0, np.exp(-(mu - mu) ** 2 /(2* sigma **2))/(np.sqrt(2*np.pi)*sigma), colors = "c", linestyles = "dashed")
    plt.vlines(mu+sigma, 0, np.exp(-(mu+sigma - mu) ** 2 /(2* sigma **2))/(np.sqrt(2*np.pi)*sigma), colors = "k", linestyles = "dotted")
    plt.vlines(mu+2*sigma, 0, np.exp(-(mu+2*sigma - mu) ** 2 /(2* sigma **2))/(np.sqrt(2*np.pi)*sigma), colors = "k", linestyles = "dotted")
    plt.vlines(mu-sigma, 0, np.exp(-(mu-sigma - mu) ** 2 /(2* sigma **2))/(np.sqrt(2*np.pi)*sigma), colors = "k", linestyles = "dotted")
    plt.vlines(mu-2*sigma, 0, np.exp(-(mu-2*sigma - mu) ** 2 /(2* sigma **2))/(np.sqrt(2*np.pi)*sigma), colors = "k", linestyles = "dotted")

    # 添加坐标轴
    plt.xticks ([mu-2*sigma, mu-sigma, mu , mu+sigma, mu+2*sigma],
                ['μ-2σ', 'μ-σ', 'μ', 'μ+σ', 'μ+2σ'])
    plt.xlabel('Value')
    plt.ylabel('Frequency')
    plt.title('Normal Distribution: $\mu = %.2f, $sigma=%.2f'%(mu,sigma))
    plt.grid(True)
    
    if despine == True:
        sns.despine(trim=True, left=True, offset=10)


后记

精彩回顾,都是一行代码实现复杂绘图的自写库系列

  数据分析,商业实践,数据可视化,网络爬虫,统计学,Excel,Word, 社会心理学,认知心理学,行为科学,民族意志学 各种专栏后续疯狂补充

  欢迎评论与私信交流!

发布了51 篇原创文章 · 获赞 29 · 访问量 8958

猜你喜欢

转载自blog.csdn.net/weixin_43329700/article/details/104464484