Python matplotlib数据可视化 绘制柱形图、堆叠图、折线图、饼图和环图
Python中可以通过matplotlib模块的pyplot子库来完成绘图。Matplotlib可用于创建高质量的图表和图形,也可以用于绘制和可视化结果。matplotlib是Python优秀的数据可视化第三方库,matplotlib.pyplot是绘制种类可视化图形的命令子库,相当于快捷方式 import matplotlib.pyplot as plt.
本文用python对一批运动员数据进行操作,读取数据、数据预处理、matplotlib数据可视化,熟悉用python进行数据分析和可视化的基本方法。
数据集部分截图如下:
pandas读取并查看数据,对于本次练习的数据,读取时需要设置encoding=‘gbk’,不然会报错。
pd.read_csv()读取csv文件,数据有17587行,17列。
import pandas as pd
df = pd.read_csv('soccer.csv', encoding='gbk')
print(df)
df.info():查看索引、数据类型和内存信息
import pandas as pd
df = pd.read_csv('soccer.csv', encoding='gbk')
print(df.info())
df.describe():查看数值型列的汇总统计情况
import pandas as pd
df = pd.read_csv('soccer.csv', encoding='gbk')
print(df.describe())
pyplot中文显示:
pyplot并不默认显示中文,坐标系中出现中文汉字,需要增加额外代码辅助。
方法一:
可以通过rcParams修改字体实现,但这种方法改变的是全局的字体。
import matplotlib as mpl
mpl.rcParams['font.family'] = 'SimHei'
mpl.rcParams['font.size'] = 15
方法二:
在有中文输出的地方,增加一个属性:fontproperties
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(0.0, 5.0, 0.02)
plt.figure(figsize=(9, 6), dpi=100)
plt.plot(a, np.cos(2 * np.pi * a), 'r--')
# 在特定的地方用中文 和改变字号
plt.xlabel('横轴:时间', fontproperties='SimHei', fontsize=15, color='green')
plt.ylabel('纵轴:振幅', fontproperties='SimHei', fontsize=15, color='red')
plt.show()
1. 绘制柱形图
(1) 将运动员年龄(Age)划分为三个年龄段:’17-26’,’27-36’,’37-47’,统计不同年龄段的人数,并用柱状图可视化。
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
# 读取数据 设置编码 不然会报错
df = pd.read_csv('soccer.csv', encoding='gbk')
# 将运动员年龄(Age)划分为三个年龄段
age_group = ["17-26", "27-36", "37-47"]
# 统计不同年龄段人数
count_1 = df[(df['Age'] >= 17) & (df['Age'] <= 26)]
count_2 = df[(df['Age'] >= 27) & (df['Age'] <= 36)]
count_3 = df[(df['Age'] >= 37) & (df['Age'] <= 47)]
age_counts = [len(count_1), len(count_2), len(count_3)]
# 设置大小 像素
plt.figure(figsize=(9, 6), dpi=100)
# 设置中文显示
mpl.rcParams['font.family'] = 'SimHei'
# 绘制柱形图 设置柱条的宽度和颜色
plt.bar(age_group, age_counts, width=0.35, color='red')
# 添加描述信息
plt.title('不同年龄段人数统计')
plt.xlabel('年龄段')
plt.ylabel('人数')
# 可以设置网格 透明度 线条样式
plt.grid(alpha=0.3, linestyle=':')
# 展示图片
plt.show()
(2) 查看不同技术等级(Skill_Moves )下的球员数量,以及哪个技术等级的球员数量最多,哪个最少,利用水平柱状图可视化。
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
df = pd.read_csv('soccer.csv', encoding='gbk')
skill_count = df['Skill_Moves'].value_counts()
skill = [f'等级{m}' for m in skill_count.index] # 列表推导式构造不同技术等级
counts = skill_count.values.tolist() # 技术等级对应人数统计的列表
# 设置中文显示
mpl.rcParams['font.family'] = 'SimHei'
# 设置大小 像素
plt.figure(figsize=(9, 6), dpi=100)
# 绘制水平柱状图
plt.barh(skill[::-1], counts[::-1], height=0.5, color='#FF00FF')
plt.title('不同技术等级人数统计')
plt.xlabel('人数')
plt.show()
2. 绘制堆叠图
将运动员年龄(Age)划分为三个年龄段:’17-26’,’27-36’,’37-47’,统计 3 个年龄段下 5个技术等级(Skill_Moves)的人数,并用堆叠图可视化。
import pandas as pd
import matplotlib.pyplot as plt
import collections
import numpy as np
import matplotlib as mpl
df = pd.read_csv('soccer.csv', encoding='gbk')
age_group = ["17-26", "27-36", "37-47"]
# & 与 | 或 不同条件之间 ()括起来
data1 = df[(17 <= df['Age']) & (df['Age'] <= 26)]
age1 = list(data1['Skill_Moves'])
data2 = df[(27 <= df['Age']) & (df['Age'] <= 36)]
age2 = list(data2['Skill_Moves'])
data3 = df[(37 <= df['Age']) & (df['Age'] <= 47)]
age3 = list(data3['Skill_Moves'])
# 分别统计三个年龄段 不同等级人数
count_1 = collections.Counter(age1).most_common()
count_2 = collections.Counter(age2).most_common()
count_3 = collections.Counter(age3).most_common()
count_3.append((5, 0)) # 37-47年龄段等级5人数为零 手动添上
counts = count_1 + count_2 + count_3
datas = [[] for i in range(5)]
for i in counts:
datas[i[0] - 1].append(i[1])
# 转化为数组 堆叠时可以对应相加
grades = np.array(datas)
# print(grades)
# 设置大小 像素
plt.figure(figsize=(9, 6), dpi=100)
# 设置中文显示
mpl.rcParams['font.family'] = 'SimHei'
plt.bar(age_group, grades[0], label='等级一', color='red', width=0.35)
plt.bar(age_group, grades[1], bottom=grades[0], label="等级二", color="#9400D3", width=0.35)
plt.bar(age_group, grades[2], bottom=grades[0] + grades[1], label="等级三", color="#0000FF", width=0.35)
plt.bar(age_group, grades[3], bottom=grades[0] + grades[1] + grades[2], label="等级四", color="#FFFF00", width=0.35)
plt.bar(age_group, grades[4], bottom=grades[0] + grades[1] + grades[2] + grades[3], label="等级五", color="#006400", width=0.35)
plt.title('不同年龄段等级人数统计')
plt.xlabel('年龄段')
plt.ylabel('人数')
plt.grid(alpha=0.3, linestyle=':')
# 显示图例 位置
plt.legend(loc=0)
plt.show()
3. 绘制折线图
利用频数分布折线图来查看运动员身高(Height)与体重(Weight)的分布
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import matplotlib as mpl
df = pd.read_csv('soccer.csv', encoding='gbk')
# <class 'pandas.core.series.Series'>
height = df['Height'].value_counts()
weight = df['Weight'].value_counts()
# SeriseL类型通过索引进行排序 也就是按身高从低到高排序
heights = height.sort_index()
weights = weight.sort_index()
mpl.rcParams['font.family'] = 'SimHei'
gs = gridspec.GridSpec(1, 2)
plt.figure(figsize=(12, 5), dpi=100)
# 设置图形显示风格
plt.style.use('ggplot')
ax1 = plt.subplot(gs[0, 0])
ax2 = plt.subplot(gs[0, 1])
# 子图1
ax1.plot(heights.index, heights.values)
ax1.set_title('运动员身高频数分布折线图')
ax1.set_xlabel('身高(cm)')
ax1.set_ylabel('人数')
# 子图2
ax2.plot(weights.index, weights.values)
ax2.set_title('运动员体重频数分布折线图')
ax2.set_xlabel('体重(kg)')
ax2.set_ylabel('人数')
plt.show()
4. 绘制饼图
(1) 使用饼图查看运动员的惯用脚(Preffered_Foot)字段中不同惯用脚人数的占比。
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
preffered_foot = list(pd.read_csv('soccer.csv', encoding='gbk')['Preffered_Foot'])
foot = ['右脚', '左脚']
counts = [preffered_foot.count('Right'), preffered_foot.count('Left')]
# 设置中文显示
mpl.rcParams['font.family'] = 'SimHei'
# 设置大小 像素
plt.figure(figsize=(9, 6), dpi=100)
plt.axes(aspect='equal') # 保证饼图是个正圆
explodes = [0, 0.2]
color = ['red', '#00FF00']
# 绘制饼图
# x:统计数据 explode:是否突出显示 label:标签 color:自定义颜色
# autopct:设置百分比的格式,保留2位小数 shadow: 有阴影 看起来立体
# startangle:初始角度 可使饼图旋转 labeldistance:标签离圆心的位置
plt.pie(counts, explode=explodes, labels=foot,
colors=color, autopct='%.2f%%', shadow=True,
startangle=15, labeldistance=0.8,
)
plt.title('不同惯用脚的运动员人数占比图', fontsize=15)
plt.show()
(2) 按照运动员的技术等级(Skill_Moves),使用环图展示出运动员不同技术等级人数的占比。
import pandas as pd
import collections
import matplotlib.pyplot as plt
import matplotlib as mpl
skill_moves = list(pd.read_csv('soccer.csv', encoding='gbk')['Skill_Moves'])
skill_count = collections.Counter(skill_moves).most_common()
skill = ['等级{}'.format(m[0]) for m in skill_count]
counts = [n[1] for n in skill_count]
# 设置大小 像素
plt.figure(figsize=(9, 6), dpi=100)
# 设置中文显示
mpl.rcParams['font.family'] = 'SimHei'
plt.axes(aspect='equal') # 保证饼图是个正圆
x_ = [1, 0, 0, 0, 0] # 用于显示空心
color = ["red", "blue", "yellow", "green", "purple"]
plt.pie(x=counts, colors=color, pctdistance=0.9,
startangle=45, autopct='%.1f%%', shadow=True,
)
# 小的空白圆填充 实现圆环效果
plt.pie(x_, radius=0.65, colors="w")
# 添加图例 可以微调位置
plt.legend(skill, bbox_to_anchor=(0.9, 0.92))
plt.title('不同技术等级的运动员人数占比图', fontsize=15)
plt.show()
其他说明
- 数据集来源于网络,仅用于知识交流,真实性未知。
- 数据的网盘链接:https://pan.baidu.com/s/1nmdwsHg99d29KSuJSaLQOw 提取码:yty6 感兴趣的读者可以提取数据自行练习,印象会更深刻。
- 欢迎提出改进意见,以期共同进步,觉得文章还不错的老铁点个赞可好呀>_<
作者:叶庭云 微信公众号:修炼Python CSDN:https://yetingyun.blog.csdn.net/ 本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。 觉得文章对你有帮助、让你有所收获的话,期待你的点赞呀,不足之处,也可以在评论区多多指正。
- 使用Combres 库 ASP.NET 网站优化
- jQuery和asp.net mvc相关资源链接
- JavaScriptSerializer 序列化json 时间格式
- Nginx反向代理+负载均衡简单实现(https方式)
- 在网页中给Flash加上超级链接
- ASP.NET MVC HandleErrorAttribute 和 远程链接
- javascript实现数字转大写金额的函数
- 如何在GridView的Footer内显示总计?
- 自定义WCF的配置文件
- Centos中动态扩容lvm逻辑卷的操作记录
- Visual Round Trip Analyzer
- ASP.NET可以在Windows Server 2008 R2 Server Core上运行
- SOA十大设计原则
- 中国人民大学文继荣:大数据的经验主义解释
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php获取微信openid方法总结
- Laravel 关联模型-关联新增和关联更新的方法
- 如何解决PHP获取不到SESSION信息之一般情况
- PHP实现通过二维数组键值获取一维键名操作示例
- laravel 判断查询数据库返回值的例子
- laravel框架数据库配置及操作数据库示例
- laravel 输出最后执行sql 附:whereIn的使用方法
- laravel框架模型、视图与控制器简单操作示例
- Laravel关系模型指定条件查询方法
- 在laravel中使用with实现动态添加where条件
- laravel Model 执行事务的实现
- 在laravel中实现事务回滚的方法
- thinkphp5框架实现数据库读取的数据转换成json格式示例
- phpfpm的作用和用法
- 浅谈PHP5.6 与 PHP7.0 区别