Python数据可视化之Matplotlib实现各种图表
数据分析就是将数据以各种图表的形式展现给领导,供领导做决策用,因此熟练掌握饼图、柱状图、线图等图表制作是一个数据分析师必备的技能。Python有两个比较出色的图表制作框架,分别是Matplotlib和Pyechart。本文主要讲述使用Matplotlib制作各种数据图表。
Matplotlib是最流行的用于绘制2D数据图表的Python库,能够在各种平台上使用,可以绘制散点图、柱状图、饼图等。
1、柱状图
是一种以长方形或长方体的高度为变量的表达图形的统计报告图,由一系列高度不等的纵向条纹表示数据分布的情况,用来比较两个或以上的价值(不同时间或者不同条件),只有一个变量,通常利用于较小的数据集分析。柱状图可以用来比较数据之间的多少,可以用来观察某一事件的变化趋势,柱状图亦可横向排列,或用多维方式表达。
实现代码:
# 导入绘图模块
import matplotlib.pyplot as plt
# 构建数据
sales = [7125,12753,13143,8635]
# 中文乱码的处理,rcParams也可以用于设置图的分辨率,大小等信息
plt.rcParams['font.sans-serif'] =['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 绘图,第一个参数是x轴的数据,第二个参数是y轴的数据,第三个参数是柱子的大小,默认值是1(值在0到1之间),color是柱子的颜色,alpha是柱子的透明度
plt.bar(range(4), sales, 0.4,color='r', alpha = 0.8)
# 添加轴标签
plt.ylabel('销量')
# 添加标题
plt.title('水果2018年度销量')
# 添加刻度标签
plt.xticks(range(4),['苹果','香蕉','梨','猕猴桃'])
# 设置Y轴的刻度范围
plt.ylim([5000,15000])
# 为每个条形图添加数值标签
for x,y in enumerate(sales):
plt.text(x,y+100,'%s' %y,ha='center')
# 显示图形
plt.show()
效果图:
只需绘制柱状图的函数bar()改成barh()就可以将柱状图长方形或长方体从垂直方向变为水平方向。
实现代码:
# 导入绘图模块
import matplotlib.pyplot as plt
# 构建数据
sales = [7125,12753,13143,8635]
# 中文乱码的处理
plt.rcParams['font.sans-serif'] =['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = ['苹果','香蕉','梨','猕猴桃']
# 绘图
plt.barh(range(4), sales, 0.4,color='r', alpha = 0.8)
# 添加轴标签
plt.ylabel('销量')
# 添加标题
plt.title('水果2018年度销量')
# 添加刻度标签
plt.yticks(range(4),['苹果','香蕉','梨','猕猴桃'])
# 设置Y轴的刻度范围
plt.xlim([5000,15000])
# 为每个条形图添加数值标签
for x,y in enumerate(sales):
plt.text(y+0.2,x,'%s' %y,va='center')
# 显示图形
plt.show()
效果图:
除了bar()函数变成barh()之外。还有其他几个地方要做修改,在给每个条形图添加数值标签时,将ha='center'改为va='center',将添加x轴标签的方法从xlabel改为ylabel。
柱状图和折线图混合使用
柱状图可以和折线图混合使用,用来表示某一个数据的变化趋势,下面是例子的柱状图表示水果的年度销量,折线图表示水果1月份的销量。
代码:
# 导入绘图模块
import matplotlib.pyplot as plt
jan_sales = [3010,4029,5021,3056]
# 构建数据
sales = [7125,12753,13143,8635]
# 中文乱码的处理
plt.rcParams['font.sans-serif'] =['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = ['苹果','香蕉','梨','猕猴桃']
plt.plot(x,jan_sales,'r')# 折线 1 x 2 y 3 color
plt.plot(x,jan_sales,'g',lw=5)# 4 line w
# 绘图
plt.bar(range(4), sales, 0.4,color='b', alpha = 0.8)
# 添加轴标签
plt.ylabel('销量')
# 添加标题
plt.title('水果2018年度销量')
# 添加刻度标签
plt.xticks(range(4),['苹果','香蕉','梨','猕猴桃'])
# 设置Y轴的刻度范围
plt.ylim([2000,15000])
# 为每个条形图添加数值标签
for x,y in enumerate(sales):
plt.text(x,y+100,'%s' %y,ha='center')
# 显示图形
plt.show()
效果图:
**2、折线图 **
折线图主要用于表示数据变化的趋势。折线图是直线将不同的点连接起来。
# 导入绘图模块
import matplotlib.pyplot as plt
#构建数据
jan_sales = [3010,4029,5021,3056]
# 中文乱码的处理
plt.rcParams['font.sans-serif'] =['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = ['苹果','香蕉','梨','猕猴桃']
#第一个参数是x轴,第二参数时y轴数据,第三个参数是线的颜色,第二个参数是线条的粗细
plt.plot(x,jan_sales,'r',lw=5)# 4 line w
# 添加标题
plt.title('水果2018年度1月份销量图')
plt.ylim([2000,15000])
# 为每个点添加数值标签
for x,y in enumerate(jan_sales):
plt.text(x,y+100,'%s' %y,ha='center')
# 显示图形
plt.show()
效果图:
折线图通过调用plot()方法绘制。
3、饼图
饼图主要是用来表示数据的占比,给人一眼就可以看出数据的占比大小。饼图使用pie()函数绘制。
import matplotlib.pyplot as plt
# 设置绘图的主题风格(不妨使用R中的ggplot分隔)
plt.style.use('ggplot')
# 构造数据
edu = [0.2515,0.3724,0.3336,0.0368,0.0057]
labels = ['苹果','香蕉','梨','猕猴桃','桔子']
explode = [0,0.1,0,0,0] # 用于突出显示大专学历人群
colors=['#FEB748','#EDD25D','#FE4F54','#51B4FF','#dd5555'] # 自定义颜色
# 中文乱码和坐标轴负号的处理
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 将横、纵坐标轴标准化处理,保证饼图是一个正圆,否则为椭圆
plt.axes(aspect='equal')
# 控制x轴和y轴的范围
plt.xlim(0,4)
plt.ylim(0,4)
# 绘制饼图
plt.pie(x = edu,# 绘图数据
explode=explode, # 突出显示香蕉人群
labels=labels, # 添加水果销量水平标签
colors=colors, # 设置饼图的自定义填充色
autopct='%.1f%%', # 设置百分比的格式,这里保留一位小数
pctdistance=0.8,# 设置百分比标签与圆心的距离
labeldistance = 1.15, # 设置销量水平标签与圆心的距离
startangle = 180, # 设置饼图的初始角度
radius = 1.5, # 设置饼图的半径
counterclock = False, # 是否逆时针,这里设置为顺时针方向
wedgeprops = {'linewidth': 1.5, 'edgecolor':'green'},# 设置饼图内外边界的属性值
textprops = {'fontsize':12, 'color':'k'}, # 设置文本标签的属性值
center = (1.8,1.8), # 设置饼图的原点
frame = 1)# 是否显示饼图的图框,这里设置显示
# 删除x轴和y轴的刻度
plt.xticks(())
plt.yticks(())
# 添加图标题
plt.title('2018年水果销量分析')
# 显示图形
plt.show()
效果图:
简单介绍下pie函数参数:
x: 指定绘图的数据
explode:指定饼图某些部分的突出显示,即呈现爆炸式
labels:为饼图添加标签说明,类似于图例说明
colors:指定饼图的填充色
autopct:设置百分比格式,如'%.1f%%'为保留一位小数
shadow:是否添加饼图的阴影效果
pctdistance:设置百分比标签与圆心的距离
labeldistance:设置各扇形标签(图例)与圆心的距离;
startangle:设置饼图的初始摆放角度, 180为水平;
radius:设置饼图的半径大小;
counterclock:是否让饼图按逆时针顺序呈现, True / False;
wedgeprops:设置饼图内外边界的属性,如边界线的粗细、颜色等, 如wedgeprops = {'linewidth': 1.5, 'edgecolor':'green'}
textprops:设置饼图中文本的属性,如字体大小、颜色等;
center:指定饼图的中心点位置,默认为原点
frame:是否要显示饼图背后的图框,如果设置为True的话,需要同时控制图框x轴、y轴的范围和饼图的中心位置;
4、散点图
散点图主要的作用是判断两个变量之间关系的强弱或者是否存在关系。
散点图由scatter()方法绘制。
import numpy as np
import matplotlib.pyplot as plt
# 数据个数
n = 50
# 均值为0, 方差为1的随机数
x = np.random.normal(0, 1, n)
y = np.random.normal(0, 1, n)
# 计算颜色值
color = np.arctan2(y, x)
# 绘制散点图
plt.scatter(x, y, s = 75, c = color, alpha = 0.5)
# 设置坐标轴范围
plt.xlim((-1.5, 1.5))
plt.ylim((-1.5, 1.5))
# 不显示坐标轴的值
plt.xticks(([-1,0,1,2,3,4]))
plt.yticks(([-1,0,1,2,3,4]))
plt.show()
效果图:
**5、箱线图 **
箱线图一般用来展现数据大小、占比、趋势等等的呈现,其包含一些统计学的均值、分位数、极值等等统计量,因此,该图信息量较大,不仅能够分析不同类别数据平均水平差异(需在箱线图中加入均值点),还能揭示数据间离散程度、异常值、分布差异等等。
使用boxplot()方法绘制。
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
np.random.seed(2) #设置随机种子
df = pd.DataFrame(np.random.rand(5,4),
columns=['A', 'B', 'C', 'D'])#先生成0-1之间的5*4维度数据,再装入4列DataFrame中
df.boxplot() #也可用plot.box()
plt.show()
效果图:
6、雷达图
雷达图可以用来显示一个周期数值的变化,也可以用来展示对个对象/维度之间的关系
import numpy as np
import matplotlib.pyplot as plt
#标签
labels = np.array(['语文','数学','英语','生物','物理','化学'])
#数据个数
dataLenth = 6
#数据
data = np.array([7,4,3,6,4,8])
angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False)
data = np.concatenate((data, [data[0]])) # 闭合
angles = np.concatenate((angles, [angles[0]])) # 闭合
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)# polar参数!!
ax.plot(angles, data, 'bo-', linewidth=2)# 画线
ax.fill(angles, data, facecolor='r', alpha=0.25)# 填充
ax.set_thetagrids(angles * 180/np.pi, labels, fontproperties="SimHei")
ax.set_title("matplotlib雷达图", va='bottom', fontproperties="SimHei")
ax.set_rlim(0,10)
ax.grid(True)
plt.show()
效果图:
**7、气泡图 **
气泡图用于判断3个变量之间是否存在某种关系。它跟散点图有点类似,只不过气泡图以气泡大小作为新的维度
import pandas as pd
import matplotlib.pyplot as plt
import pandas as pd
d = {"时间":pd.Series([2006,2007,2008,2009,2010]),
"数量":pd.Series([10,200,120,150,300]),
"大小":pd.Series([50,130,40,50,160]),
"分类":pd.Series([1,2,0,1,2]),
"判断":pd.Series([True,True,True,True,True])}
df=pd.DataFrame(d)
#先定义气泡大小,rank 函数将大小列进行大小分配,越大的值分配结果也越高
#n 为倍数,用来调节气泡的大小,且看后头
size=df['大小'].rank()
n=20
#定义一个字典,将颜色跟对应的分类进行绑定
color={0:'red',1:'blue',2:'orange'}
#增加color的参数,用列表解析式将data分类中的每个数据的数字映射到前面color的颜色中
plt.scatter(df['数量'],df['大小'],color=[color[i] for i in df['分类']],s=size*n,alpha=0.6)
plt.show()
效果图:
气泡图用也是scatter方法绘制,和散点图一样。差别在于点的大小不一样,散点图的点都是一样的,而气泡图点的大小不一样。
以上就是柱状图、散点图、气泡图、折线图的实现方式。希望给大伙带来帮助。
Python数据可视化之Matplotlib实现各种图表的更多相关文章
- Python数据可视化——使用Matplotlib创建散点图
Python数据可视化——使用Matplotlib创建散点图 2017-12-27 作者:淡水化合物 Matplotlib简述: Matplotlib是一个用于创建出高质量图表的桌面绘图包(主要是2D ...
- python 数据可视化(matplotlib)
matpotlib 官网 :https://matplotlib.org/index.html matplotlib 可视化示例:https://matplotlib.org/gallery/inde ...
- Python数据可视化库-Matplotlib(一)
今天我们来学习一下python的数据可视化库,Matplotlib,是一个Python的2D绘图库 通过这个库,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率图,条形图,错误图,散点图等等 废 ...
- Python数据可视化利器Matplotlib,绘图入门篇,Pyplot介绍
Pyplot matplotlib.pyplot是一个命令型函数集合,它可以让我们像使用MATLAB一样使用matplotlib.pyplot中的每一个函数都会对画布图像作出相应的改变,如创建画布.在 ...
- Python数据可视化库-Matplotlib(二)
我们接着上次的继续讲解,先讲一个概念,叫子图的概念. 我们先看一下这段代码 import matplotlib.pyplot as plt fig = plt.figure() ax1 = fig.a ...
- Python数据可视化之matplotlib
常用模块导入 import numpy as np import matplotlib import matplotlib.mlab as mlab import matplotlib.pyplot ...
- python数据可视化(matplotlib)
- Python的可视化包 – Matplotlib 2D图表(点图和线图,.柱状或饼状类型的图),3D图表(曲面图,散点图和柱状图)
Python的可视化包 – Matplotlib Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型地2D图表和一些基本的3D图表.Matplotlib最早是为了可 ...
- python数据可视化-matplotlib入门(7)-从网络加载数据及数据可视化的小总结
除了从文件加载数据,另一个数据源是互联网,互联网每天产生各种不同的数据,可以用各种各样的方式从互联网加载数据. 一.了解 Web API Web 应用编程接口(API)自动请求网站的特定信息,再对这些 ...
随机推荐
- codeblocks(其它软件)修改后缀文件的打开默认方式
- (二叉树 递归) leetcode94. Binary Tree Inorder Traversal
Given a binary tree, return the inorder traversal of its nodes' values. Example: Input: [1,null,2,3] ...
- 阅读阿里文档总结————Mysql数据库篇
一:建表规范 1.针对于任何字段如果为非负数,必须是 unsigned: 2.表达逻辑删除的字段名 is_deleted,1 表示删除,0 表示未删除: (1为是:0为否) 3.主键索引名为 pk_字 ...
- unicorn与nginx通讯--[ruby unix socket]
[龍昌博客] http://www.xefan.com/archives/84146.html unicorn是如何与nginx通讯的——介绍ruby中的unix socket Ruby 应用服务典型 ...
- [Android] Android 最全 Intent 传递数据姿势
我们都是用过 Intent,用它来在组件之间传递数据,所以说 Intent 是组件之间通信的使者,一般情况下,我们传递的都是一些比较简单的数据,并且都是基本的数据类型,写法也比较简单,今天我在这里说的 ...
- Spring Boot 2.x以后static下面的静态资源被拦截
今天创建一个新的Spring Boot项目,没注意到spring boot的版本,发现静态资源无法访问.百度一下发现好像是Spring Boot 2.0版本以后static目录不能直接访问. 接下来直 ...
- JGUI源码:Tip实现(14)
tip是当鼠标放到控件上显示的提示文本,下面说下实现思路方法一: 使用hover:before,hover:after组合一个三角符号和一个圆角矩形实现,以右三角为例 .jgui-tip:after ...
- PHP代码审计之XSS操作
XSS XSS是Cross Site Scripting(跨站脚本攻击), 它与sql注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除的目的,而在XSS攻击中,通过插入 ...
- css 实现加载中3个点跳动
<style type="text/css">.loading:after { overflow: hidden; display: inline-block; ver ...
- ZOJ 3604 Tunnel Network(凯莱定理)
题目链接: E - Tunnel Network ZOJ - 3604 题目大意: 给定编号1-n的点,和给定编号1-S 的联通图,刚开始1号联通图只有 1个顶点,就是编号为1的顶点,2号联通图也只有 ...