Matplotlib 图表学习笔记

目标一、掌握Python数据可视化分析库的安装与开发环境配置

目标二、熟练绘制常见图形如:散点图,折线图,条形图,直方图,饼状图,箱形图

目标三、掌握绘图的三大系统:pyplot,pylab(不推荐),面向对象

目标四、了解坐标轴的调整,添加文字注释,区域填充,及特殊图形patches的使用

目标五、了解第三方可视化库:pyecharts

一、Matplotlib 新手入门篇

1.1 Matplotlib 简介

基于Python语言的开源项目,旨在为Python提供一个数据绘图包;
由John Hunter 发起;
函数式绘图和面向对象式绘图

  • 函数式绘图,参考了matlab里面的绘图函数语法,简单易上手
  • 面向对象式绘图,更懂matplotlib底层架构,有更多的功能

官网:https://matplotlib.org/

1.2 Matplotlib 快速预览

1.2.1 Matplotlib 对象总览
在matplotlib 中,整个图像为一个Figure对象。在Figure对象中可以包含一个或者多个Axes对象。每个Axes对象都是一个拥有自己坐标系统的绘图区域。
在这里插入图片描述

1.3 Matplotlib 一个最简单的绘图

调用 figure 创建一个绘图对象: plt.figure(figsize=(8,4))

figure: 指定绘图对象的宽度和高度,单位为英寸;
dpi: 指定绘图对象的分辨率,每英寸多少个像素,缺省值为80;

import matplotlib.pyplot as plt
plt.figure(figsize=(8,4))
plt.plot([1,2,3],[5,7,4])
plt.show()
1.4 美化图表 - 为图表加入图例、标题与标签
import matplotlib.pyplot as plt
# 用来正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
# 用来正常显示负号
plt.rcParams['axes.unicode_minus'] = False

x = [1,2,3]
y = [5,7,4]

x2 = [1,2,3]
y2 = [10,14,12]

plt.plot(x,y,label='第一条线')
plt.plot(x2,y2,label='第二条线')

plt.xlabel('x轴')
plt.ylabel('y轴')

plt.title('为图表加入\n图例、标题与标签')
plt.legend()  # 显示图例
plt.show()

二、Matplotlib 绘制常见图表

2.1 绘制折线图

适用场景:折线图适合二维的大数据集,还适合多个二维数据集的比较。一般用来表示趋势的变化,横轴一般为日期字段
优势:容易反应出数据变化的趋势
# 准备数据
x = [1,2,3,4,5,6,7,8]
y = [5,2,4,2,1,4,5,2]
# 绘制折线图
plt.plot(x,y,label='折线图')
# 绘制x轴标签
plt.xlabel('x')
# 绘制y轴标签
plt.ylabel('y')
# 绘制标题
plt.title('绘制折线图')
# 利用legend()方法去显示图例
plt.legend()
# 显示图表
plt.show()

2.2 绘制柱状图/条形图
适用场景:显示各个项目之间的比较轻快,和柱状图类似的作用
优势:每个条都清晰表示数据,直观
劣势:柱状图的局限在于只适用中小规模的数据集
延伸图表:堆积条形图、百分比堆积条形图

plt.bar([1,3,5,7,9],[5,2,7,8,2],label="柱状图-01")
#plt.barh([1,3,5,7,9],[5,2,7,8,2],label="柱状图-01")  #条形图
# color = '',用这个参数设置图表显示颜色
plt.bar([2,4,6,8,10],[8,6,2,5,6],label="柱状图-02",color='g')
#plt.barh([2,4,6,8,10],[8,6,2,5,6],label="柱状图-02",color='g') # 条形图
plt.legend()
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.title('Matplotlib绘制柱状图')
plt.show()

2.3 绘制直方图
直方图又称质量分布图,它是表示资料变化情况的一种主要工具。
用直方图可以解析出资料的规则性,比较直观地看出产品质量特性的分布状态,对于资料分布状况一目了然,便于判断其总体质量分布情况。

直方图非常像条形图,倾向于通过将区段组合在一起来显示分布。

population_ages = [22,55,62,45,21,22,34,42,42,4,99,102,110,120,121,122,130,111,115,112,80,75,65,54,44,43,42,48]
bins = [0,10,20,30,40,50,60,70,80,90,100,110,120,130]
plt.hist(population_ages,bins,histtype='bar',label='年龄分布图',rwidth=0.8)
plt.xlabel('x')
plt.ylabel('y')
plt.title('绘制直方图')
plt.legend()
plt.show()

2.4 绘制饼图
适用场景:显示各项的大小与各项占总和的比例。适用简单的占比比例图,在不要求数据精细的情况适用。
优势:明确显示数据的比例情况,尤其适合渠道来源等场景
劣势:不是具体的数值,只是整体的占比情况

slices = [7,2,2,13]
activities = ['sleeping','eating','working','playing']
cols = ['c','m','r','b']

plt.pie(slices,
		labels = activities,
		colors = cols,
		startangle=90,
		shadow = True,
		explode = (0,0.1,0,0),
		autopct='%1.1f%%'
)

plt.title('饼图')
plt.show()

2.5 绘制散点图
适用场景:显示若干数据系列中各个数值之间的关系,类似XY轴,判断两变量之间是否存在某种关联。散点图适用于三维数据集,但其中只有两维数据是需要比较的。另外,散点图还可以看出极值的分布情况
优势:对于处理值的分布和数据点的分簇区域(通过设置横纵项的辅助线),散点图都很理想。如果数据集中包含非常多的点,那么散点图便是最佳图标类型
劣势:在点状图中显示多个序列看上去非常混乱

x = [1,2,3,4,5,6,7,8]
y = [5,2,4,2,1,4,5,2]

plt.scatter(x,y,label='skitscat',color='k',s=25,marker='o')

plt.xlabel('x')
plt.ylabel('y')
plt.title('绘制散点图')
plt.legend()
plt.show()

2.6 绘制堆叠图
堆叠图用于显示【部分对整体】随时间的关系。堆叠图基本上类似于饼图,只是随时间而变化。

days = [1,2,3,4,5]

sleeping = [7,8,6,11,7]
eating = [2,3,4,3,2]
working = [7,8,7,2,2]
playing = [8,5,7,8,13]

# 分别设置每条线的颜色,标签,宽度等
plt.plot([],[],color='m', label='Sleeping', linewidth=5)
plt.plot([],[],color='c', label='Eating', linewidth=5)
plt.plot([],[],color='r', label='Working', linewidth=5)
plt.plot([],[],color='k', label='Playing', linewidth=5)

plt.stackplot(days,sleeping,eating,working,playing,colors=['m','c','r','k'])

plt.xlabel('x')
plt.ylabel('y')
plt.title('堆叠图')
plt.legend()
plt.show()

在这里插入图片描述

三、Matplotlib 综合演练篇

3.1 快速创建三角函数

import matplotlib.pyplot as plt
import numpy as np

X = np.linspace(-np.pi,np.pi,256,endpoint=True)
(C,S) = np.cos(X),np.sin(X)

plt.plot(X,C)
plt.plot(X,S)
plt.show()

3.2 修改线宽和颜色

# 'b-'是"color='blue',linestyle='-'" ,'-':实线,'--':虚线 , 'lw':代表线宽
plt.plot(X,C,'b-',lw=2.5)
plt.plot(X,S,'r-',lw=2.5)

3.3 调整坐标轴,增大上下左右的留白

plt.xlim(X.min()*1.5,X.max()*1.5)
plt.ylim(C.min()*1.5,C.max()*1.5)

3.4 坐标刻度改为3.14

plt.xticks([-np.pi,-np.pi/2.,0,np.pi/2,np.pi])
plt.yticks([-1,0,1])

3.5 坐标刻度改为π

plt.xticks([-np.pi,-np.pi/2,0,np.pi/2,np.pi],[r'$-\pi$',r'$-\pi/2$',r'$0$',r'$-\pi/2$',r'$+\pi$',])

3.6 把坐标轴放在中间

ax = plt.gca() # 通过plt.gca()获得当前的Axes对象ax
ax.spines['right'].set_color('none') # 先把右边和上边的边界设置为不可见
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom') # 然后把下边界和左边界移动到0点
ax.spines['bottom'].set_position(('data',0)) 
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))

3.7 用图例区分正余弦曲线

plt.plot(X,C,'b-',lw=2.5,label='cosine')
plt.plot(X,S,'r-',lw=2.5,label='sine')
plt.legend(loc='upper left')

3.8 特殊点注释

t = 2*np.pi/3
# 以下代码是:画出需要标注的蓝色的线
plt.plot([t,t],[0,np.cos(t)],color='blue',linewidth=2.5,linestyle='--')
# 以下代码是:画出需要标注的蓝色的点
plt.scatter([t,],[np.cos(t),],50,color='blue')
# 以下代码是:给蓝色的点添加注释
plt.annotate(r'$\cos(\frac{2\pi}{3})=-\frac{1}{2}$',
            xy=(t,np.cos(t)),xycoords='data',
            xytext=(-90,-50),textcoords='offset points',fontsize=16,
            arrowprops=dict(arrowstyle="->",connectionstyle="arc3,rad=.2"))
plt.plot([t,t],[0,np.sin(t)],color='red',linewidth=2.5,linestyle='--')
plt.scatter([t,],[np.sin(t),],50,color='red')
plt.annotate(r'$\sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',
            xy=(t,np.sin(t)),xycoords='data',
            xytext=(+10,+30),textcoords='offset points',fontsize=16,
            arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2'))

3.9 细节的修改

for label in ax.get_xticklabels() + ax.get_yticklabels():
	label.set_fontsize(18)
	label.set_bbox(dict(facecolor='w',edgecolor='None',alpha=0.4))

最终效果图:
在这里插入图片描述
小知识点汇总:

  • 利用np.linspace(-np.pi,np.pi,256,endpoint=True)可以快速生产数据
  • 通过plt.gca()获得当前的Axes对象ax
  • 通过plt.xlim() 方法来实现图表的留白
  • 通过plt.xticks()、plt.yticks()来设置坐标轴刻度
  • 通过plt.annotate()方法来为图表添加注释
  • for label in ax.get_xticklabels() + ax.get_yticklabels():方式来遍历图表中的label对象
四、Matplotlib 高级篇

4.1 再论柱(条)形图- 柱状/条形图高级

4.1.1 做好绘制前的准备工作:导包,中文环境设置,准备画布与数据

import matplotlib.pyplot as plt
# 用来正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
# 用来正常显示负号
plt.rcParams['axes.unicode_minus'] = False

# 取出一张画布
fig = plt.figure(1)

# 确定绘图范围,由于只需要画一张图,所以我们将整张画布作为绘图的范围
# 111:表示设置绘图范围为1行1列,最后一个1代表输出到第1块画布上
ax1 = plt.subplot(111)

# 整理我们准备绘制的数据
data = np.array([15,20,18,25])

4.1.2 准备绘制图表所需的参数数据

width = 0.5
x_bar = np.arange(4)

4.1.3 核心图形绘制

rect = ax1.bar(x=x_bar,height=data,width=width,color='lightblue')

4.1.4 向各条形上添加数据标签

for rec in rect:
	x = rec.get_x()
	height = rec.get_height()
	ax1.text(x+0.2,1.02*height,str(height)+'w')

4.1.5 绘制x,y坐标轴刻度及标签,标题,并最终显示出图表

ax1.set_xticks(x_bar)
ax1.set_xticklabels(('第一季度','第二季度','第三季度','第四季度'))
ax1.set_ylabel('销量(单位:万件)')
ax1.set_title('2017年季度销售量统计')
ax1.grid(True)
ax1.set_ylim(0,28)

plt.show()

4.2 Matplotlib中利用subplot() 绘制多幅图形

plt.figure(figsize=(6,6),dpi=80)
plt.figure(1) # 创建第一个画板
plt.subplot(211) # 划分画板为2行1列,共2块区域,并获取当前画板的第一个子图
plt.plot([1,2,3]) # 绘图
plt.subplot(212) # 获取当前画板的第二个子图
plt.plot([4,5,6]) # 绘图

plt.figure(2) # 创建第二个画板
plt.plot([4,5,6]) # 在当前画板上绘图,默认子图
plt.title('第二个画板') # 做出当前画板111的标题

plt.figure(1) # 切换到画板1,注意:当前 subplot(212) 仍然被调用中
plt.subplot(211) # 切换到第一块区域 
plt.title('第一个画板(区域1)') # 设置211的标题
plt.subplot(212) # 切换到第二块区域

4.3 从文件中加载数据并在matplotlib 中可视化

import csv
x = []
y = []
with open('demo.csv','r') as csvfile:
    plots = csv.reader(csvfile,delimiter=',')
    for row in plots:
        x.append(int(row[0]))
        y.append(int(row[1]))
plt.plot(x,y,label='模拟数据')
plt.xlabel('x')
plt.ylabel('y')
plt.title('演示')
plt.legend()
plt.show()

4.4 从网络中加载数据并在matplotlib 中可视化

import tushare as ts
df = ts.realtime_boxoffice()
x = list(df['MovieName'])
y = list(df['BoxOffice'])
plt.bar(x,y,label='票房')
plt.xlabel('x轴-电影名称')
plt.ylabel('y轴-实时票房')
plt.title('实时票房')
plt.legend()
plt.show()

4.5 借助Numpy 包简化数据读取并在matplotlib中可视化

x,y = np.loadtxt('demo.csv',delimiter=',',unpack=True)
plt.plot(x,y,label='模拟数据')
plt.xlabel('x')
plt.ylabel('y')
plt.title('演示')
plt.legend()
plt.show()

小知识点总结:

  • 利用plt.figure 来创建与切换画布
  • 利用plt.subplot(211)方式来切割画布区域
五、Pandas + Matplotlib 简化数据可视化

5.1 Pandas中的Series.plot方法的函数

import pandas as pd
s = pd.Series(np.random.randn(10).cumsum(),index=np.arange(0,100,10))
s.plot()
plt.show()

5.2 Pandas中的DataFrame.plot方法的函数

import pandas as pd
df = pd.DataFrame(np.random.randn(10,4),columns=list('ABCD'),index=np.arange(0,100,10))
df.plot()
plt.show()

5.3 Pandas+Matplotlib 绘制条形图/柱状图

fig,axes = plt.subplots(2,1)
data = pd.Series(np.random.randn(16),index=list('abcdefghijklmnop'))
data.plot(kind='bar',ax=axes[0],color='k',alpha=0.7)
data.plot(kind='barh',ax=axes[1],color='k',alpha=0.7)
plt.show()

5.4 Pandas+Matplotlib 绘制直方图

df = pd.read_excel('demo.xlsx','Sheet1')
# 绘制直方图
fig = plt.figure()
ax = fig.add_subplot(111)
ax.hist(df['Age'],bins=7)
plt.title('Age distribution')
plt.xlabel('Age')
plt.ylabel('Employee')
plt.show()

5.5 Pandas+Matplotlib 绘制箱线图

df = pd.read_excel('demo.xlsx','Sheet1')
fig = plt.figure()
ax = fig.add_subplot(111)
ax.boxplot(df['Age'])
plt.show()

5.6 利用pandas 处理后的数据绘图

# 条形图
var = df.groupby('Gender').Sales.sum()
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_xlabel('Gender')
ax1.set_ylabel('Sum of Sales')
ax1.set_title('Gender wish Sum of Sales')
var.plot(kind='bar')
plt.show()

# 折线图
var = df.groupby('BMI').Sales.sum()
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_xlabel('BMI')
ax1.set_ylabel('Sum of Sales')
ax1.set_title('BMI wish Sum of Sales')
var.plot(kind='line')
plt.show()

5.7 利用pandas绘制柱状堆积图

var = df.groupby(['BMI','Gender']).Sales.sum()
var.unstack().plot(kind='bar',stacked=True,color=['red','blue'])
plt.show()

5.8 Pandas+Matplotlib 绘制散点图

fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(df['Age'],df['Sales'])
plt.show()

5.9 Pandas+Matplotlib 绘制气泡图
需要展示三维以上数据,分布情况的时候考虑气泡图

fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(df['Age'],df['Sales'],s=df['Income']) # 第三个变量表明根据收入显示气泡的大小
plt.show()

5.10 Pandas+Matplotlib 绘制饼图

var = df.groupby(['Gender']).sum()
label_list = var.index
plt.axis('equal')
plt.pie(var,labels=label_list,autopct='%1.1f%%')
plt.title('expense)
plt.show()

小知识点总结:

  • Pandas处理数据,Serias或DataFrame的plot方法绘图
  • Pandas处理数据,Matplotlib 绘图
六、Matplotlib 番外篇:PyEcharts

6.1 pyecharts 简介

pyecharts 是一个用于生成Echarts图表的类库。Echarts是百度开源的一个数据可视化JS库。用Echarts 生成的图可视化效果非常棒,pyecharts是利用python 实现生成echarts图表的类目。
官网:http://pyecharts.org

安装 pyecharts

pip 安装

$ pip install pyecharts

源码安装

$ git clone https://github.com/pyecharts/pyecharts.git
$ cd pyecharts
$ pip install -r requirements.txt
$ python setup.py install

# 或者执行 python install.py

6.2 第一个PyEcharts图表

from pyecharts.charts import Bar

bar = Bar()
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
# render 会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件
# 也可以传入路径参数,如 bar.render("mycharts.html")
bar.render()

6.3 通用配置项

6.4 图解pyecharts 通用配置项
在这里插入图片描述
绘制图表,由于参考教程过旧,故直接参考官网示例

参考网址:
[1]: https://www.jianshu.com/p/aa4150cf6c7f
[2]: https://www.jianshu.com/p/b5594a20ecee
[3]: https://blog.csdn.net/u012535605/article/details/80677791

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值