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)自动请求网站的特定信息,再对这些 ...
随机推荐
- 分布式锁与实现(一)——基于Redis实现 【比较靠谱】
转: 分布式锁与实现(一)——基于Redis实现 概述 目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CAP理论告诉我们“任何一个分布式系统 ...
- KFold,StratifiedKFold k折交叉切分
python风控评分卡建模和风控常识(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005214003&am ...
- finalize()与PhantomReference学习笔记
众所周知,Java语言提供了自动垃圾回收机制,使得程序员不用考虑自己释放不再使用的内存.既然回收内存的活都让Java自己干了,程序员在这方面能干的事情就不多了.尽管如此,Java也提供了一些让程序员对 ...
- 分库分表后跨分片查询与Elastic Search
携程酒店订单Elastic Search实战:http://www.lvesu.com/blog/main/cms-610.html 为什么分库分表后不建议跨分片查询:https://www.jian ...
- Android相关面试题---初识
一 .Activity的生命周期 Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称为返回栈(Back Stack).每当我们启动一个新的活动,它会 ...
- Linux环境安装jdk12-rpm
此博客只是本人的个人学习记录,若有什么误导观看者,请不要怪我... 1.环境准备: Linux环境:Centos7 jdk版本:JavaSE12 下载地址:https://www.oracl ...
- C# MVC分页简单介绍
ASP.NET MVC中进行分页的方式有多种,这里介绍一种简单实用的方法 一:在实现分页之前,先添加“PagedList”和“PagedList.Mvc”两个组件,具体下载直接在NuGet程序包里收索 ...
- 获取iframe 内容
parent.$.find("iframe")[0].contentWindow.getvalue(); h.find("iframe")[0].content ...
- element-UI使用中:el-input type为textarea时@change无法触发?
自己瞎尝试解决了的.官方文档上居然没写@input事件,醉了.
- CF1153D Serval and Rooted Tree
题目地址:CF1153D Serval and Rooted Tree 挺好玩儿也挺考思维的一道题 思路:树形DP+贪心 数组 \(d\) 维护这样一个值: 对于一个节点 \(x\) ,它的值最大可以 ...