五、Matplotlib:绘图和可视化
- 简介
- 简单绘制线形图
- plot函数
- 支持图类型
- 保存图表
1、简介
Matplotlib是一个强大的Python绘图和数据可视化的工具包。数据可视化也是我们数据分析的最重要的工作之一,可以帮助我们完成很多操作,例如:找出异常值、必要的一些数据转换等。完成数据分析的最终结果也许就是做一个可交互的数据可视化。
安装方式:
pip install matplotlib
引用方法:
import matplotlib.pyplot as plt
2、简单绘制线形图
plt.plot() # 绘图函数 plt.show() # 显示图像
在jupyter notebook中不执行这条语句也是可以将图形展示出来
import matplotlib.pyplot as plt import numpy as np data = np.arange(10) plt.plot(data) plt.show() # 显示图像,在notebook中不执行这一句也可以
执行结果:
虽然seaborn这些库和pandas的内置绘图函数能够处理许多普通的绘图任务,如果需要自定义一些高级功能的话就必须要matplotlib API.
3、plot函数
plot函数:绘制折线图
- 线型linestyle(-,-.,--,..)
- 点型marker(v,^,s,*,H,+,X,D,O,...)
- 颜色color(b,g,r,y,k,w,...)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字体样式
plt.rcParams['axes.unicode_minus'] = False # 自动转编码 允许中文可以显示
plt.plot([0,3,9,15,30],linestyle = '-.',color = 'r',marker = 'o') # linestyle:折线样式 color:颜色 marker:节点标记
图像标注:
方法 | 描述 | |
---|---|---|
plt.title() | 设置图像标题 | |
plt.xlabel() | 设置x轴名称 | |
plt.ylabel() | 设置y轴名称 | |
plt.xlim() | 设置x轴范围 | |
plt.ylim() | 设置y轴范围 | |
plt.xticks() | 设置x轴刻度 | |
plt.yticks() | 设置y轴刻度 | |
plt.legend() | 设置曲线图例 |
plt.plot([0,3,9,15,30],linestyle = '-.',color = 'r',marker = 'o',label="A") plt.plot([1,3,16,23,30],[30,23,13,25,30],label='B') plt.title("Title") # 标题 plt.xlabel('X') # x轴名称 plt.ylabel('Y') # y轴名称 plt.xticks(np.arange(0,30,2)) # x轴刻度 plt.xlim(-0.2,10,2) # x轴范围 plt.legend() # 曲线图例
运行图例:
绘制数学函数:
使用Matplotlib模块在一个窗口中绘制数学函数y=x, y=x**2,y=sinx的图像,使用不同颜色的线加以区别,并使用图例说明各个线代表什么函数。
x = np.arange(-100,100) y1 = x y2 = x ** 2 y3 = np.sin(x) ----------------------- plt.plot(x,y1,label="y=x") plt.plot(x,y2,label="y=x^2") plt.plot(x,y3,label="y=sin(x)") plt.ylim(-100,100) plt.legend()
运行结果:
4、支持的图类型
函数 | 说明 | |
---|---|---|
plt.plot(x,y,fmt) | 坐标系 | |
plt.boxplot(data,notch,position) | 箱型图 | |
plt.bar(left,height,width,bottom) | 柱状图 | |
plt.barh(width,bottom,left,height) | 横向柱状图 | |
plt.polar(theta,r) | 极坐标系 | |
plt.pie(data,explode) | 饼图 | |
plt.psd(x,NFFT=256,pad_to,Fs) | 功率谱密度图 | |
plt.specgram(x,NFFT=256,pad_to,F) | 谱图 | |
plt.cohere(x,y,NFFT=256,Fs) | X-Y相关性函数 | |
plt.scatter(x,y) | 散点图 | |
plt.step(x,y,where) | 步阶图 | |
plt.hist(x,bins,normed) | 直方图 |
# 柱状图 data = [12,34,23,54] labels = ['Jan','Fed','Mar','Apr'] plt.xticks([0,1,2,3],labels) # 设置x轴刻度 plt.bar([0,1,2,3],data)
# 横向柱状图 data = [12,34,23,54] labels = ['Jan','Fed','Mar','Apr'] plt.yticks([0,1,2,3],labels) plt.barh([0,1,2,3],data)
# DataFrame数组图 df = pd.DataFrame({ 'Jan':pd.Series([1,2,3],index=['a','b','c']), 'Fed':pd.Series([4,5,6],index=['b','a','c']), 'Mar':pd.Series([7,8,9],index=['b','a','c']), 'Apr':pd.Series([2,4,6],index=['b','a','c']) }) df.plot.bar() # 水平柱状图,将每一行中的值分组到并排的柱子中的一组 df.plot.barh(stacked=True,alpha=0.5) # 横向柱状图,将每一行的值堆积到一起
# 饼图 plt.pie([10,20,30,40],labels=list('abcd'),autopct="%.2f%%",explode=[0.1,0,0,0]) # 饼图 plt.axis("equal") plt.show()
# 散点图 import random x = np.random.randn(100) y = np.random.randn(100) plt.scatter(x,y)
5、保存图表到文件
plt.savafig('文件名.拓展名')
文件类型是通过文件扩展名推断出来的。因此,如果你使用的是.pdf,就会得到一个PDF文件。
plt.savefig('123.pdf')
savefig并非一定要写入磁盘,也可以写入任何文件型的对象,比如BytesIO:
from io import BytesIO buffer = BytesIO() plt.savefig(buffer) plot_data = buffer.getvalue()
参数 | 说明 | |
---|---|---|
fname | 含有文件路径的字符串或者Python的文件型对象。 | |
dpi | 图像分辨率,默认为100 | |
format | 显示设置文件格式("png","jpg","pdf","svg","ps",...) | |
facecolor、edgecolor | 背景色,默认为"W"(白色) | |
bbox_inches | 图表需要保存的部分。设置为”tight“,则尝试剪除图表周围空白部分 |
练习题:
测试数据连接:https://share.weiyun.com/5WO0KMA
1.绘制每个国家或者地区的电影数量的柱状图

import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.figure(figsize=(13,6)) # 设置画布大小 df = pd.read_csv('./douban_movie.csv') # 读取文件 res = df.groupby('产地').size().sort_values(ascending=False) # 以产地分组 进行排序 plt.title('每个国家或者地区的电影数量', fontsize=20) x = res.index # 产地作为x轴 y = res.values # 值作为y轴 plt.xlabel('产地', fontsize=20,color='blue') plt.xticks(rotation=90, fontsize=15) plt.ylabel('数量',fontsize=20,color='red') for a, b in zip(x,y): # 通过zip将x y进行映射 plt.text(a, b+100, b, horizontalalignment='center', fontsize=13) # a:x轴 b:y轴 horizontalalignment:水平居中 b+100:不要紧挨柱子 plt.bar(x,y) # 绘制树状图 plt.show()
2.绘制每年电影上映数量的曲线图

import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.figure(figsize=(13,6)) # 设置画布大小 plt.title('每年电影上映数量的曲线图',fontsize=15,color='black') plt.xlabel('年代',fontsize=20,color='red') plt.ylabel('数量',fontsize=20,color='blue') df = pd.read_csv('./douban_movie.csv') # 读取文件 res = df.groupby('年代').size().sort_index()[:-2] # 按照索引进行排序 切除不需要的脏数据 x = res.index # 获取x轴的值 y = res.values # 获取y轴的值 plt.plot(x,y) # 绘制折线图 plt.show() # 展示
3:根据电影的长度绘制饼图

import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.title('电影时长分布图',fontsize=15,color='black') plt.figure(figsize=(10,13)) # 设置画布大小 df = pd.read_csv('./douban_movie.csv') # 读取文件 df_res = df['时长'] res = pd.cut(df_res,[0,60,90,120,150,180,210]) # df_res被切割的数据 列表为切割的范围 res1 = res.value_counts() # 获取在一定分为内值的个数 x = res1.index y = res1.values patch, l_text, p_text = plt.pie(y, labels = x, autopct='%.2f%%') # autopct:百分比展示 for p in p_text: p.set_size(15) p.set_color('white') for l in l_text: l.set_size(13) l.set_color('r') plt.pie(res1) # 设置饼状图 plt.show()