【基于数据分析-画图展示】

[复制链接]
发表于 2026-1-8 18:13:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
导包

  1. import numpy as np
  2. import pandas as pd
  3. import os
  4. import matplotlib.pyplot as plt
  5. #正常显示汉字
  6. plt.rcParams['font.sans-serif'] = ['SimHei']
  7. #正常显示负号
  8. plt.rcParams['axes.unicode_minus'] = False
  9. #更改当前工作目录
  10. os,chdir()
复制代码
1. Matplotlib 根本画图



  • 方式1:状态接口
  1. #准备x轴y轴的一些坐标点
  2. x = [-3,5,7]
  3. y = [10,2,5]
  4. # 创建一个画板
  5. plt.figure(figsize = (12,6))
  6. #开始绘图,传入x轴与y轴
  7. plt.plot(x,y)
  8. #设置坐标轴值的范围
  9. plt.xlim(-3,10)
  10. plt.ylim(-3,10)
  11. #设置网格
  12. plt.grid(True)
  13. #设置x,y轴标签
  14. plt.xlabel('x轴')
  15. plt.ylabel('y轴')
  16. #设置标题
  17. plt.title('状态接口')
  18. #具体画图动作
  19. plt.show()
复制代码


  • 面向对象方式,画图
  1. #准备x轴y轴的一些坐标点
  2. x = [-3,5,7]
  3. y = [10,2,5]
  4. # 创建一个画板
  5. fig .ax = plt.subplots(figsize = (12,6))
  6. #开始绘图,传入x轴与y轴
  7. ax.plot(x,y)
  8. #设置坐标轴值的范围
  9. ax.xlim(-3,10)
  10. ax.ylim(-3,10)
  11. #设置x,y轴标签
  12. ax.xlabel('x轴')
  13. ax.ylabel('y轴')
  14. #设置标题
  15. ax.set_title('状态接口')
  16. #具体画图动作
  17. plt.show()
复制代码
2.安斯科姆数据集- 表明可视化告急性-散点图



  • scatter:散点图
  • hist :直方图
  • 加载数据,获取df对象
  1. # 1. 加载数据, 获取df对象.
  2. anscombe = pd.read_csv('data/anscombe.csv')
  3. anscombe
复制代码


  • 检察统计信息
  • 转置矩阵 :anscombe.groupby(‘dataset’).describe().T
  1. # 2. 查看数据的统计信息.
  2. anscombe.describe()
  3. anscombe[anscombe.dataset == 'I'].describe()
  4. anscombe[anscombe.dataset == 'II'].describe()
  5. anscombe[anscombe.dataset == 'III'].describe()
  6. anscombe[anscombe.dataset == 'IV'].describe()
复制代码


  • 具体可视化动作
  • 获取数据动作作为x,y轴数据
  1. anscombe[anscombe.dataset == 'I'].x
  2. anscombe[anscombe.dataset == 'I'].y
  3. anscombe.query('dataset == "I"')
  4. anscombe.query("dataset == 'I'")
复制代码
  1. # 3. 具体的可视化动作.
  2. # 3.1 获取画布对象, 指定: 宽高.
  3. fig = plt.figure(figsize=(16, 8))
  4. # 3.2 获取坐标轴后对象.
  5. # 2行2列, 对应坐标轴1, 即: 第1个位置.
  6. ax1 = fig.add_subplot(2, 2, 1)
  7. # 2行2列, 对应坐标轴2, 即: 第2个位置.
  8. ax2 = fig.add_subplot(2, 2, 2)
  9. # 2行2列, 对应坐标轴3, 即: 第3个位置.
  10. ax3 = fig.add_subplot(2, 2, 3)
  11. # 2行2列, 对应坐标轴4, 即: 第4个位置.
  12. ax4 = fig.add_subplot(2, 2, 4)
  13. # 3.3 具体的绘制散点图的过程.
  14. ax1.scatter(anscombe.query('dataset == "I"').x, anscombe.query('dataset == "I"').y)
  15. ax2.scatter(anscombe.query('dataset == "II"').x, anscombe.query('dataset == "II"').y)
  16. ax3.scatter(anscombe.query('dataset == "III"').x, anscombe.query('dataset == "III"').y)
  17. ax4.scatter(anscombe.query('dataset == "IV"').x, anscombe.query('dataset == "IV"').y)
  18. # 3.4 设置标题
  19. # 子图的标题
  20. ax1.set_title('数据集I')
  21. ax2.set_title('数据集II')
  22. ax3.set_title('数据集III')
  23. ax4.set_title('数据集IV')
  24. # 画板(画布)的标题
  25. fig.suptitle('Anscome(安斯科姆)数据集', fontsize=21)
  26. # 4. 具体的绘图
  27. plt.show()
复制代码
3.单变量 :直方图



  • 等差数列 : np.lispace(起始值,终极值,个数) 包左包右
  1. # 需求: 展示不同消费区间, 频次关系.
  2. # 1. 读取数据, 获取df对象.
  3. tips = pd.read_csv('data/tips.csv')
  4. tips
复制代码
  1. # 2. 查看上述数据的常用统计值.
  2. tips.describe()  # total_bill(总消费金额), 最小: 3.07, 最大: 50.81
复制代码
  1. # 3. 回顾: 等差数列,  3.07 ~ 50.81之间, 11个值 => 能划分成10个区间
  2. np.linspace(3.07, 50.81, 11)
复制代码


  • hist(): 直方图, total_bill: 表现要绘制的列. bins: 分别成几个区间(底层是: 等差数列)
  1. # 4. 绘制图形 => 直方图.
  2. # hist(): 直方图,  total_bill: 表示要绘制的列.   bins: 划分成几个区间(底层是: 等差数列)
  3. # 写法1: df对象.hist()      属于 Pandas的 绘图方式.
  4. # tips.hist('total_bill', bins=10, figsize=(12, 6))
  5. # 写法2: plt.hist()      属于 Matplotlib的 绘图方式.
  6. # plt.hist(tips['total_bill'], bins=10)
  7. plt.hist(tips.total_bill, bins=10)
  8. plt.xlabel('总消费金额')
  9. plt.ylabel('频次')
  10. plt.title('总消费金额-直方图(适用于 单变量)', fontsize=21)
  11. plt.show()
复制代码
  1. # 5. 按照总金额进行排序, 查看数据的个数.
  2. tips.sort_values('total_bill')
复制代码
4.双变量:散点图

  1. # 需求: 绘图, 分析 总消费金额 和 小费之间的关系. 可以通过 散点图来实现, 它适用于: 呈现当1个变量变化的时候, 另一个变量的变化情况(大体趋势).
  2. # 1. 查看源数据.
  3. tips
复制代码
  1. # 2. 绘制图形.
  2. # 2.1 获取画板.
  3. plt.figure(figsize=(12, 6))
  4. # 2.2 绘制散点图.
  5. plt.scatter(tips.total_bill, tips.tip)  # x轴 => 总小费金额, y轴 => 小费
  6. # 2.3 设置坐标轴的标签.
  7. plt.xlabel('总消费金额')
  8. plt.ylabel('小费')
  9. # 2.4 设置标题
  10. plt.title('总消费金额-小费散点图(适用于双变量)', fontsize=21)
  11. # plt.grid(True)  # 网格
  12. # 2.5 绘图.
  13. plt.show()
复制代码
5.多变量 : 散点图

  1. # 需求: 在上述基础上, 加入性别信息, 进行绘图, 观察: 性别, 总消费金额, 小费之间的关系.
  2. # 1. 观察数据源
  3. tips
复制代码
  1. # 2. apply()函数实现, 通过自定义的函数, 给 df对象 新增1列.
  2. def recode_sex(sex):
  3.     if sex == 'Female':
  4.         return 'blue'
  5.     else:
  6.         return 'red'
  7. # 3. 调用自定义的函数, 给df对象新增1列
  8. tips['sex_color'] = tips.sex.apply(recode_sex)
  9. # 4. 查看结果
  10. tips
复制代码
  1. # 5. 具体的绘图.
  2. # 5.1 创建画板.
  3. plt.figure(figsize=(12, 6))
  4. # 5.2 绘制散点图.
  5. # x轴 => 总消费金额, y轴 => 小费, c=颜色, s=大小, alpha=透明度
  6. plt.scatter(tips.total_bill, tips.tip, c=tips.sex_color, s=tips['size'] * 10, alpha=0.5)
  7. # 5.3 设置坐标轴的标签.
  8. plt.xlabel('总消费金额')
  9. plt.ylabel('小费')
  10. # 5.4 设置标题.
  11. plt.title('总消费金额-小费散点图(r:男, b:女)', fontsize=21)
  12. # 5.5 绘制
  13. plt.show()
复制代码
数据可视化-Pandas

导包

1.加载数据

  1. # 1. 加载数据, 获取df对象
  2. reviews = pd.read_csv('data/winemag-data_first150k.csv', index_col=0)   # 指定第1列为: 索引列
  3. reviews
复制代码
2.绘制-条形图



  • bar:条形图
  1. # 需求1: 将所有的葡萄酒品牌按照产区分类, 查看哪个产区的葡萄酒品种多.
  2. # reviews.province.value_counts()
  3. # reviews.province.value_counts().head(10)
  4. # reviews.province.value_counts().head(10).plot.bar(figsize=(12, 6), fontsize=11, color=['r', 'g', 'b', 'y', 'k', 'm', 'c', 'pink', 'gray','orange'])
  5. # 上述格式优化版, 因为绘图的参数后续我们要一直用, 所以可以把它们抽取成 变量, 后续直接传参即可.
  6. kwargs_dict = dict(figsize=(12, 6), fontsize=11, color=['r', 'g', 'b', 'y', 'k', 'm', 'c', 'pink', 'gray','orange'])
  7. reviews.province.value_counts().head(10).plot.bar(**kwargs_dict)
  8. plt.show()
复制代码
  1. # 需求2: 计算产葡萄酒最多的前10个产区, 产出葡萄酒的比例.
  2. # 只计算: 加利福尼亚洲 产出葡萄酒占比.
  3. # (reviews.province.value_counts().head(1) / len(reviews)).plot.bar(**kwargs_dict)
  4. # 产出葡萄酒最多的10个产区, 产出比例.
  5. (reviews.province.value_counts().head(10) / len(reviews)).plot.bar(**kwargs_dict)
复制代码
  1. # 需求3: 展示 评分数量 的分布情况.
  2. reviews.points.value_counts().sort_index().plot.bar(**kwargs_dict)
复制代码


  • line:折线图
  1. # 需求: 查看葡萄酒评分的分布情况, 折线图展示.
  2. reviews.points.value_counts().sort_index().plot.line(**kwargs_dict)
复制代码


  • area面积图
  1. # 需求: 查看葡萄酒评分的分布情况, 折线图展示.
  2. reviews.points.value_counts().sort_index().plot.area(**kwargs_dict)
复制代码


  • pie:饼图
  1. # 需求: 查看葡萄酒评分的分布情况, 折线图展示.
  2. # reviews.points.value_counts().sort_index().plot.pie(**kwargs_dict)        # 分类较多, 不方便查看.
  3. # 需求: 将所有的葡萄酒品牌按照产区分类, 查看哪个产区的葡萄酒品种多.
  4. reviews.province.value_counts().head(10).plot.pie(**kwargs_dict)
  5. plt.show()
复制代码
数据可视化-Seabron

导包

  1. import numpy as np
  2. import pandas as pd
  3. import seaborn as sns
  4. import os
  5. import matplotlib.pyplot as plt
  6. plt.rcParams['font.sans-serif'] = ['SimHei']  # 正常显示汉字
  7. plt.rcParams['axes.unicode_minus'] = False  # 正常显示负号
  8. os.chdir(r'D:\Workspace\Work-20\numpyProject')   # 改变当前的工作目录.  change current work directory
复制代码
  1. # 1. 记载数据, 获取df对象.
  2. tips = pd.read_csv('data/tips.csv')
  3. tips
复制代码
图形名称



  • histplot - 直方图
  • kdeplot- 密度图
  • countplot-计数图
  • 散点图

    • scatterplot
    • regplot
    • jointplot

  • boxplot- 箱变量
  • violinplot-小提琴变量
1.直方图-单变量



  • data-要操纵的df大概Series对象
  • x:x轴数据
  • y:y轴数据
  • bins -直方图-分别几个区间
  • hue-分组字段,把雷同分组数据画到一张图上
  • kde 绘制核密度线
  1. fig, ax = plt.subplots(figsize=(10, 5))
  2. # data: 要操作的df 或者 Series对象
  3. # x: x轴数据
  4. # y: y轴数据
  5. # bins: 直方图, 划分区间的个数.
  6. # hue: 分组字段, 默认为None, 会按照该字段进行分组, 把相同分组数据画到一张图上.
  7. # kde: 绘制 核密度预估曲线
  8. # 写法1: 传入df对象 和 它的列名
  9. sns.histplot(data=tips, x='total_bill', bins=10, hue='sex', kde=True)
  10. # 写法2: 可以直接传入Series对象.
  11. # sns.histplot(tips['total_bill'], bins=10)
  12. ax.set_title('直方图-总消费金额分布情况')
  13. plt.show()
复制代码
2.密度图

  1. # 密度图 和 直方图的区别: 密度图是连续的 => 概率分布, 直方图是离散的 => 样本数据.
  2. # 应用场景: 基于少量的样本数据, 去推理总体数据的概率分布情况.
  3. fig, ax = plt.subplots(figsize=(10, 5))
  4. # x轴: 总消费金额(样本数据),  y: 密度值(概率分布)
  5. sns.kdeplot(data=tips, x='total_bill')
  6. ax.set_title('密度图-总消费金额分布情况')
  7. plt.show()
复制代码
3.计数图-单变量

  1. # 需求: 按照星期进行分组, 统计每个星期的消费次数.
  2. # 方式1: 计数图
  3. # 计数图 = 按照某个字段分组, 统计每个分组的数量, 然后绘制成: 条形图(柱状图)
  4. # 1. 获取画布, 坐标轴对象.
  5. fig, ax = plt.subplots(figsize=(10, 5))
  6. # 2. 绘制 计数柱状图
  7. sns.countplot(data=tips, x='day', color='red')  # 底层 = 分组 + 聚合.
  8. # 3. 设置标题
  9. ax.set_title('消费次数分布情况')
  10. # 4. 具体的绘图.
  11. plt.show()
复制代码
  1. # 需求: 按照星期进行分组, 统计每个星期的消费次数.
  2. # 方式2: 手动分组 + 聚合计算, 然后绘图.
  3. # 1. 获取画布, 坐标轴对象.
  4. # fig, ax = plt.subplots(figsize=(10, 5))
  5. # 2. 绘制 手动计算并绘图.
  6. # tips.groupby('day').total_bill.count().plot.bar(figsize=(10, 5), color=['red', 'blue', 'yellow'])
  7. tips.day.value_counts().plot.bar(figsize=(10, 5), color=['red', 'blue', 'yellow'])
  8. # 3. 设置标题
  9. ax.set_title('消费次数分布情况')
  10. # 4. 具体的绘图.
  11. plt.show()
复制代码
4.散点图



  • scatterplot()函数实现
  1. # 1. 获取画布, 坐标轴对象.
  2. fig, ax = plt.subplots(figsize=(10, 5))
  3. # 2. 绘制散点图, 分析: 总消费金额, 小费 之间的关系.
  4. # sns.scatterplot(data=tips, x='total_bill', y='tip')
  5. # 2. 绘制散点图, 分析: 总消费金额, 小费, 性别 之间的关系.
  6. sns.scatterplot(data=tips, x='total_bill', y='tip', hue='sex')
  7. # 3. 设置标题
  8. ax.set_title('散点图-总消费金额和小费之间的关系')
  9. # 4. 绘图
  10. plt.show()
复制代码


  • regplot()函数实现
  1. # 1. 获取画布, 坐标轴对象.
  2. fig, ax = plt.subplots(figsize=(10, 5))
  3. # 2. 绘制散点图, 分析: 总消费金额, 小费 之间的关系.
  4. # fit_reg: 是否绘制回归线, True(默认) => 绘制,  False => 不绘制.
  5. # 拟合回归线: 就是基于你的数据点(散点), 拟合出一条直线, 底层跑了: 线性回归.
  6. # sns.regplot(data=tips, x='total_bill', y='tip', fit_reg=False)
  7. sns.regplot(data=tips, x='total_bill', y='tip', fit_reg=True)
  8. # 3. 设置标题
  9. ax.set_title('散点图-总消费金额和小费之间的关系')
  10. # 4. 绘图
  11. plt.show()
复制代码


  • jiontplot()函数实现
  1. # 细节: 某些函数在绘图的时候, 是直接绘制的, 无需指定画板等, 也没有figsize属性设置: 图形宽高.
  2. # 这类函数一般都有 height属性, 设置图形宽高.
  3. # 可以把 jointplot()理解为: 散点图 + 直方图(每行每列都会绘制直方图)
  4. # 1. 绘制散点图, 分析: 总消费金额, 小费 之间的关系.
  5. sns.jointplot(data=tips, x='total_bill', y='tip', height=10)
  6. # 如果设定了kind属性值, 可以将去绘制成: 蜂巢图.
  7. # sns.jointplot(data=tips, x='total_bill', y='tip', height=10, kind='hex')
  8. # 2. 设置标题
  9. plt.title('散点图-总消费金额和小费之间的关系')
  10. # 3. 绘图
  11. plt.show()
复制代码
5. 2D密度图,双变量

  1. # 需求: 通过 2D 密度图, 分析: 总消费金额, 小费 之间的关系.
  2. # 1. 获取画布, 坐标轴对象.
  3. fig, ax = plt.subplots(figsize=(10, 5))
  4. # 2. 绘制 2D 密度图
  5. # cbar: 是否绘制颜色条
  6. # fill: 是否填充颜色
  7. sns.kdeplot(data=tips, x='total_bill', y='tip', fill=True, cbar=True)
  8. # 3. 设置标题
  9. ax.set_title('2D Kde TotalBill & Tip')
  10. # 4. 绘图
  11. plt.show()
复制代码
6. 箱线图,双变量

  1. # 需求: 通过 箱线图(盒须图, 箱子图), 分析: 总消费金额, 时间 之间的关系.
  2. # IQR: Interquantile Range, 四分位距表示法,  IQR = Q3 - Q1
  3. # 1. 获取画布, 坐标轴对象.
  4. fig, ax = plt.subplots(figsize=(10, 5))
  5. # 2. 绘制 箱线图
  6. sns.boxplot(data=tips, x='time', y='total_bill')
  7. # 3. 设置标题
  8. ax.set_title('箱线图-分析就餐时间和消费总金额之间的关系')
  9. # 4. 绘图
  10. plt.show()
复制代码
7.小提琴图-双变量

  1. # 小提琴图就是在箱线图的基础上, 加入了密度图, 即: 把箱线图的箱线 替换成 核密度曲线.
  2. # 需求: 通过 箱线图(盒须图, 箱子图), 分析: 总消费金额, 时间 之间的关系.
  3. # 1. 获取画布, 坐标轴对象.
  4. fig, ax = plt.subplots(figsize=(10, 5))
  5. # 2. 绘制 箱线图
  6. # hue: 可以理解为分组字段, 会按照该字段进行分组, 把相同分组数据画到一张图上.  这里是按照 性别分组
  7. # split: 是否拆分, True => 拆分, False => 不拆分, 它一般要结合hue属性一起使用.
  8. sns.violinplot(data=tips, x='time', y='total_bill')
  9. # sns.violinplot(data=tips, x='time', y='total_bill', hue='sex', split=True)
  10. # 3. 设置标题
  11. ax.set_title('小提琴图-分析就餐时间和消费总金额之间的关系')
  12. # 4. 绘图
  13. plt.show()
复制代码
8. Seaborn-绘制多变量

  1. # 细节: 在Seaborn中, 绘制多变量没有固定的套路, 都是通过属性传参即可.
  2. # 需求: 查看 时间(就餐类型, time) 和 总消费金额, 性别之间的关系.
  3. # 1. 获取画布, 坐标轴对象.
  4. fig, ax = plt.subplots(figsize=(10, 5))
  5. # 2. 绘制图形 => 小提琴图
  6. sns.violinplot(data=tips, x='time', y='total_bill', hue='sex', split=True)
  7. # 3. 设置标题.
  8. ax.set_title('小提琴图-多变量-时间, 金额, 性别')
  9. # 4. 具体的绘制动作
  10. plt.show()
复制代码
9. Seaborn-风格与样式



  • 格式-sns.set_style(‘风格名’)
  • white (白色无网格)
  • whitegrid(白色有网格)
  • dark(玄色无网格)
  • darkgrid(玄色有网格)
  • ticks刻度线
  1. # 细节: Seaborn的样式(风格)只需要设置一次即可, 后续就会生效了.
  2. # 格式: sns.set_style('风格名')
  3. # 常用的风格: white(白色无网格), whitegrid(白色有网格), dark(黑色无网格), darkgrid(黑色有网格), ticks(刻度线)
  4. # 设置风格
  5. sns.set_style('ticks')
  6. # 需求: 查看 时间(就餐类型, time) 和 总消费金额, 性别之间的关系.
  7. # 1. 获取画布, 坐标轴对象.
  8. fig, ax = plt.subplots(figsize=(10, 5))
  9. # 2. 绘制图形 => 小提琴图
  10. sns.violinplot(data=tips, x='time', y='total_bill', hue='sex', split=True)
  11. # 3. 设置标题.
  12. ax.set_title('ViolinPlot time & totall_bill & sex')
  13. # 4. 具体的绘制动作
  14. plt.show()
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表