Matplotlib可视化之使用pandas和Seaborn绘制精美图表详解

作者:

文章目录
  • 要统计个数的两种方式 # 思路一:稍微复杂一点 # df.groupby(‘province’)[‘province’].count().sort_values(ascending=False).head(10) df[‘province’].value_counts()
  • 底层依赖 Matplotlib pip install seaborn 已知数据
  • 目录
    • Matplotlib 可视化
      • 入门演示
      • 设置刻度尺,配置中文
      • 添加网格,标题
      • 一张图绘制多个 / 增加图例
      • 多个坐标系,在一个画布
      • 其他图像绘制
      • 绘制直方图
      • 绘制饼图
      • 散点图
    • pandas 绘图
      • 柱状图
      • 面积图
      • 案例
    • Seaborn 绘图
      • 柱状图
      • 绘制直方图
      • 案例
      • 箱线图 / 何须图
      • 小提琴图

    matplotlib 的绘图基本步骤:

    • 创建画布
    • 准备数据集,X轴,Y轴
    • 可选:颜色,线型,标签,网格,图例,标题,坐标轴标签。
    • 绘制图像
    import matplotlib.pyplot as plt
    # 创建一个10英寸的宽和5英寸的高的画布
    # dpi 点数 80,表示清晰度。
    # 10 * 80,5 * 80
    plt.figure(figsize=(10, 5), dpi=80)
    
    # 准备数据
    x = [1, 2, 3, 4, 5, 6, 7]
    y = [6, 2, 10, 14, 21, 25, 30]
    
    # 准备绘制
    plt.plot(x, y) # 折线图
    
    # 展示图
    plt.show()
    

    import matplotlib.pyplot as plt
    # 设置中文
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    

    通过 plt.xticksplt.yticks 设置对应的刻度尺

    # 返回一个迭代对象,0 - 60,这是 X轴
    x = range(60)
    
    # y 轴,范围 15 ~ 18
    y = [random.uniform(15, 18) for i in x]
    
    # 创建画布
    plt.figure(figsize=(10, 5), dpi=80)
    
    # 绘制图像
    plt.plot(x, y)
    
    # 自定义X轴和Y轴
    x_ticks_label = [f'11点{i}分' for i in x]
    y_ticks_label = [i for i in range(0, 25)]
    
    # 具体设置,但是如果不切片,那会显得很密集,所以需要切片,注意必须都切片
    plt.xticks(x[::5], x_ticks_label[::5])
    plt.yticks(y_ticks_label[::5])
    
    # 显示
    plt.show()
    

    主要实现plt.grid

    • linestyle:设置线风格。
      • (-)实线
      • (–)虚线
      • (-.)一个杠一个.
      • (:)两个点
      • (' ')留空、空格
    • alpha:设置透明度,最大1,最小0

    设置标题 / 保存为图片

    • xlabel
    • ylabel
    • title
    • savefig
    import matplotlib.pyplot as plt
    import random
    x = range(60)
    y = [random.uniform(15, 18) for i in x]
    plt.figure(figsize=(10, 5), dpi=80)
    plt.plot(x, y)
    
    # 自定义X轴和Y轴
    x_ticks_label = [f'11点{i}分' for i in x]
    y_ticks_label = [i for i in range(0, 25)]
    
    plt.xticks(x[::5], x_ticks_label[::5])
    plt.yticks(y_ticks_label[::5])
    
    # 添加网格
    plt.grid(linestyle=':', alpha=1)
    
    # 添加标签
    plt.xlabel('时间', fontsize=15)
    plt.ylabel('温度', fontsize=15)
    # 添加标题
    plt.title('温度变化曲线', fontsize=20)
    
    plt.savefig('temp.png')
    
    plt.show()
    

    绘制多个图的关键点,给每个plot要加一个label,表示名字,后续图例使用。

    • color 用于设置颜色,生成的图例有颜色。
    • label 文字
    # 准备数据
    x = range(60)
    # 第一个图的数据
    y = [random.uniform(15, 18) for i in x]
    # 第二个图的数据
    m = [random.uniform(1, 10) for i in x]
    plt.figure(figsize=(10, 5), dpi=80)
    
    # 绘制第一个线
    plt.plot(x, y, label='北京')
    # 绘制第二个线
    plt.plot(x, m, label='摩诃')
    
    颜色字符 风格字符
    r 红色 – 实线
    g 绿色 – – 虚线
    b 蓝色 -. 点划线
    w 白色 : 点虚线
    c 青色 ' ' 留空、空格
    m 洋红
    y 黄色
    k 黑色

    加图例的关键代码,loc 设置 best,表示自动匹配最好的位置。这个 loc 会根据 label 来匹配,如果在绘制时没设置 label,不会生成的。

    loc 设置图例位置

    # 增加图例
    plt.legend(loc='best')
    

    设置位置

    位置 string 位置代码
    'best' 0
    'upper right' 1
    'upper left' 2
    'lower left' 3
    'lower right' 4
    'right' 5
    'center left' 6
    'center right' 7
    'lower center' 8
    'upper center' 9
    'center' 10

    完整代码演示

    import matplotlib.pyplot as plt
    import random
    # 准备数据
    x = range(60)
    # 第一个图的数据
    y = [random.uniform(15, 18) for i in x]
    # 第二个图的数据
    m = [random.uniform(1, 10) for i in x]
    plt.figure(figsize=(10, 5), dpi=80)
    
    # 绘制第一个线
    plt.plot(x, y, label='北京', color='r')
    # 绘制第二个线
    plt.plot(x, m, label='摩诃', color='c')
    
    # 增加图例
    plt.legend(loc='best')
    
    x_ticks_label = [f'11点{i}分' for i in x]
    y_ticks_label = [i for i in range(0, 25)]
    plt.xticks(x[::5], x_ticks_label[::5])
    plt.yticks(y_ticks_label[::5])
    plt.grid(linestyle=':', alpha=1)
    plt.xlabel('时间', fontsize=15)
    plt.ylabel('温度', fontsize=15)
    plt.title('温度变化曲线', fontsize=20)
    plt.show()
    

    主要是通过下面,获取到了分割后的画布,对每个画布进行单独设置。

    fig, ax = plt.subplots(figsize=(20, 8), nrows=1, ncols=2)
    

    完整代码

    import matplotlib.pyplot as plt
    import random
    # 准备数据
    x = range(60)
    y = [random.uniform(15, 18) for i in x]
    m = [random.uniform(1, 10) for i in x]
    
    # 面向对象绘图,fig -> 画布(1行2列的画布),ax -> 坐标系
    fig, ax = plt.subplots(figsize=(20, 8), nrows=1, ncols=2)
    
    # 绘制图像
    ax[0].plot(x, y, color='r', label='北京')
    ax[1].plot(x, m, color='c', label='摩诃')
    
    # 添加刻度
    # 刻度变量
    x_ticks_label = [f'11点{i}分' for i in x]
    y_ticks_label = [i for i in range(0, 25)]
    
    # 具体添加刻度的操作
    ax[0].set_xticks(x[::5])  # 图 1 的 x轴
    ax[0].set_yticks(y_ticks_label[::5])  # 图 1 的 y轴
    ax[0].set_xticklabels(x_ticks_label[::5])  # 图 1 的 x轴的值
    
    # 具体添加刻度的操作
    ax[1].set_xticks(x[::5])  # 图 1 的 x轴
    ax[1].set_yticks(y_ticks_label[::5])  # 图 1 的 y轴
    ax[1].set_xticklabels(x_ticks_label[::5])  # 图 1 的 x轴的值
    plt.show()
    

    目前是这样,我们继续添加

    设置 x y 轴的标题和大小

    ax[0].set_ylabel('温度')
    ax[0].set_xlabel('时间')
    ax[0].set_title('一段时间的温度变化', fontsize=20)
    
    ax[1].set_ylabel('温度')
    ax[1].set_xlabel('时间')
    ax[1].set_title('一段时间的温度变化', fontsize=20)
    
    
    # 添加图例
    ax[0].legend(loc='best')
    ax[1].legend(loc=0)
    
    # 保存图片
    plt.savefig('test.png')
    
    plt.show()
    

    matplotlib.org/stable/gallery/index.html 官方案例库

    • 折线图用来看趋势
    • 柱状图用来看对比
    • 直方图用来展示数据的分布情况
    • 散点图用来描述两个连续变量之间的关系

    绘制柱状图

    import matplotlib.pyplot as plt
    # 1. 准备数据
    x = ['A', 'B', 'C', 'D', 'E']
    y = [3, 6, 1, 8, 2]
    
    # 额外可以设置画布大小
    plt.figure(figsize=(20,8))
    
    # 2. 绘制柱状图
    plt.bar(x, y, color='r')
    
    # 3. 设置 x轴,y轴标签 和标题
    plt.xlabel('分类名')
    plt.ylabel('商品个数')
    plt.title('商品分类统计图', fontsize=15)
    plt.show()
    

    由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据范围,纵轴表示分布情况。

    特点:绘制连续性的数据展示一组或者多组数据的分布状况(统计)

    import matplotlib.pyplot as plt
    import numpy as np
    # 1. 准备数据
    data = np.random.randn(500)
    
    # 2. 创建面板
    plt.figure(figsize=(20, 8))
    
    # 3. 绘制图形,rwidth 柱子之间的宽度,bins 柱子大小
    plt.hist(data, bins=20, color='r', alpha=0.5, rwidth=0.8)
    
    # 4. 显示
    plt.show()
    

    import matplotlib.pyplot as plt
    # 准备数据
    sizes = [25, 35, 25, 15]
    # 分类标签
    labels = ['电脑', '手机', '键盘', '鼠标']
    
    # 就提绘图动作, autopct 显示百分比
    plt.pie(sizes, labels=labels, autopct='%1.1f%%')
    # 设置图表标题
    plt.title("Simple Pie Chart")
    plt.show()
    

    import matplotlib.pyplot as plt
    
    x = [1, 2, 3, 4, 5]
    y = [2, 3, 5, 7, 11]
    
    plt.scatter(x, y, color='red')  # 绘制红色散点图
    plt.title("Simple Scatter Plot")  # 设置图表标题
    plt.xlabel("X-axis")  # 设置X轴标签
    plt.ylabel("Y-axis")  # 设置Y轴标签
    plt.show()  # 显示图表
    

    要统计个数的两种方式

    # 思路一:稍微复杂一点
    # df.groupby('province')['province'].count().sort_values(ascending=False).head(10)
    df['province'].value_counts()
    

    df['province'].value_counts().head(10).plot.bar(fontsize=15, figsize=(10,6), color=['r', 'g', 'b', 'y', 'c', 'm', 'k', 'pink', 'gray', 'orange'])
    

    kwords = dict(fontsize=15, figsize=(10, 6), color=['r', 'g', 'b', 'y', 'c', 'm', 'k', 'pink', 'gray', 'orange'])
    df['province'].value_counts().head(10).plot.area(**kwords)
    

    获取产葡萄酒最多的10个产地的 占比

    kwords = dict(fontsize=15, figsize=(10, 6), color=['r', 'g', 'b', 'y', 'c', 'm', 'k', 'pink', 'gray', 'orange'])
    (df['province'].value_counts().head(10) / len(df)).plot.bar(**kwords)
    

    展示每个评分的葡萄酒种类(个数)

    kwords = dict(fontsize=15, figsize=(10, 6), color=['r', 'g', 'b', 'y', 'c', 'm', 'k', 'pink', 'gray', 'orange'])
    df['points'].value_counts().sort_index().plot.bar(**kwords) # 柱状图
    df['points'].value_counts().sort_index().plot.area(**kwords) # 面积图
    df['points'].value_counts().sort_index().plot.line(**kwords) # 折线图
    

    底层依赖 Matplotlib

    pip install seaborn
    

    已知数据

    按照性别,进行统计

    • x 是绘制的列名
    • hue 是分组的名字
    import seaborn as sns
    # 联网加载数据集
    df = sns.load_dataset('tips')
    # 按照性别字段进行统计
    sns.countplot(data=df, x='sex')
    sns.countplot(data=df, x='day', hue='sex')
    

    import seaborn as sns
    # 联网加载数据集
    df = sns.load_dataset('tips')
    sns.histplot(data=df, x='total_bill', hue='sex')
    

    如何修改画布大小和标题

    import seaborn as sns
    import matplotlib.pyplot as plt
    # 设置乱码
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    
    fig, ax = plt.subplots(figsize=(10, 6))
    sns.histplot(data=df, x='total_bill', hue='sex')
    ax.set_title('男女总账单分布情况', fontsize=20)
    plt.show()
    

    需求:描述总账单金额和小费的分布情况(散点图,关系图)

    import seaborn as sns
    import matplotlib.pyplot as plt
    
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    
    fig, ax = plt.subplots(figsize=(10, 6))
    # x轴。总账单,y轴,消费,按照性别分组
    sns.scatterplot(data=df, x='total_bill', y='tip', hue='sex')
    ax.set_title('总账单金额和小费的关系图', fontsize=20)
    plt.show()
    

    还有其他方式绘制出,散点图,它不能使用分组

    # 拟合回归线
    sns.regplot(data=df, x='total_bill', y='tip')
    

    还有一种方式,带上直方图的散点图,注意它不需要和上面代码混合在一起,它自带画布等

    import seaborn as sns
    import matplotlib.pyplot as plt
    
    sns.jointplot(data=df, x='total_bill', y='tip')
    plt.show()
    

    它如果加上,分组,会使用折线图,而不是直方图

    sns.jointplot(data=df, x='total_bill', y='tip', hue='sex')
    plt.show()
    

    加上 kind = red,使用正态分布,它不允许与 hue 分组一起使用

    sns.jointplot(data=df, x='total_bill', y='tip', kind='reg')
    plt.show()
    

    还可以变成,蜂巢图

    sns.jointplot(data=df, x='total_bill', y='tip', kind='hex')
    plt.show()
    

    • Q3:四分之三
    • 中位数:二分之一
    • q1:四分之一
    import seaborn as sns
    import matplotlib.pyplot as plt
    # 联网加载数据集
    df = sns.load_dataset('tips')
    # 线箱图
    sns.boxplot(data=df, x='time', y='total_bill')
    plt.show()
    

    import seaborn as sns
    import matplotlib.pyplot as plt
    # 联网加载数据集
    df = sns.load_dataset('tips')
    sns.violinplot(data=df, x='time', y='total_bill')
    plt.show()
    

    希望分组,使用 hue

    sns.violinplot(data=df, x='time', y='total_bill', hue='sex')
    

    希望切割,使用 split

    sns.violinplot(data=df, x='time', y='total_bill', hue='sex', split=True)
    

    以上就是Matplotlib可视化之使用pandas和Seaborn绘制精美图表详解的详细内容,更多关于Matplotlib可视化绘图的资料请关注风君子博客其它相关文章!

    您可能感兴趣的文章:

    • Python可视化与交互matplotlib库的详细介绍
    • Python可视化工具Matplotlib的20种图表用法
    • 使用Python Matplotlib处理地理数据可视化
    • 使用Matplotlib创建自定义可视化图表的方法小结
    • 使用Matplotlib创建漂亮的数据可视化图表
    • matplotlib实现矩阵和图像的可视化表示
    • 使用Python的数据可视化库Matplotlib实现折线图
    • Python数据可视化实践之使用Matplotlib绘制图表

    站内搜索