目录
第一关:画图接口
任务描述:
相关知识:
一、导入matplotlib
二、显示图像
三、画图接口
编程要求:
测试说明:
第二关:线形图
任务描述:
相关知识:
一、绘制线形图
二、设置颜色和风格
三、设置坐标轴上下限
四、设置图形标签
编程要求:
测试说明:
第三关:散点图
任务描述:
相关知识:
一、plot绘制散点图
二、scatter画散点图
三、plot与scatter效率对比
编程要求:
测试说明:
第四关:直方图
任务描述:
相关知识:
一、什么是直方图
二、绘制直方图
编程要求:
测试说明:
第五关:饼图
任务描述:
相关知识:
一、饼图
二、绘制饼图
三、嵌套饼图
编程要求:
测试说明:
第一关:画图接口
任务描述:
本关任务:掌握matplotlib
的基本使用技巧,并能简单使用matplotlib
进行可视化。
相关知识:
在深入使用matplotlib
之前你需要知道几个matplotlib
技巧,这些技巧能帮助你更快速掌握matplotlib
。
一、导入matplotlib
和numpy
,pandas
一样,在导入matplotlib
时我们也可以用一些常用的简写形式:
import matplotlib as mpl
import matplotlib.pyplot as plt
pyplot
是最常用的画图模块接口,功能非常强大。
二、显示图像
开发环境的不同,显示图像的方式也就不一样,一般有三种开发环境,分别是脚本、IPython shell
、IPython Notebook
。
在脚本中使用matplotlib
进行可视化时显示图像可以使用plt.show()
。
在IPython shell
中使用matplotlib
可视化非常方便,使用%matplotlib
命令启动matplotlib
模式。之后的任何plt
命令都会自动打开一个图像窗口,当有新的命令,图像就会更新。但对已经画好的图像不会自动实时更新。对于这种可以使用plt.draw()
强制更新。
在IPython Notebook
中画图和IPthon shell
类似,也需要使用%matplotlib
命令。图像的显示是嵌在IPython Notebook
页面中。有两种展示形式:%matplotlib notebook
交互式图形;%matplotlib inline
静态图形。
matplotlib
还可以直接将图像保存文件,通过plt.savefig("test.jpg")
命令保存文件。
plt.savefig("test.jpg")
三、画图接口
matplotlib
有两个画图接口:一个是便捷的matlab
风格接口,另一个是功能更强大的面向对象接口。
matplotlib
的matlab
接口许多语法都和MATLAB
类似,所以使用过MATLAB
的朋友们想必很快就能上手matplotlib
。
import matplotlib.pyplot as plt#导入模块
plt.figure(figsize=(10,10))#创建图形,并设置大小为10 x 10
plt.subplot(2,1,1)#创建子图1(行,列,子图编号)
plt.plot([1,2,3,4], [1,2,3,4])
plt.subplot(2,1,2)#创建子图2(行,列,子图编号)
plt.plot([4,3,2,1], [1,2,3,4])
plt.show()
面向对象接口可以适应更加复杂的场景,更好地控制图形,在画比较复杂的图形市,面向对象方法会更方便。通过下面的代码,可以用面向对象接口重新创建之前的图形。
fig,ax=plt.subplots(2)#ax是一个包含2个axes对象的数组
ax[0].plot([1,2,3,4], [1,2,3,4])
ax[1].plot([4,3,2,1], [1,2,3,4])
plt.show()
编程要求:
在右侧编辑器Begin-End
补充代码,对传入的x
,y
两个数组做折线图,x
对应x
轴,y
对应y
轴。并保存到Task1/image1/T2.png
,具体要求如下:
- 折线图的
figsize
为(10, 10)
; - 文件名为
Task1/image1/T2.png
。
测试说明:
平台会对你编写的代码进行测试:
预期输出:你的答案与正确答案一致
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
def student(x,y):
# ********** Begin *********#
fig = plt.figure(figsize=(10,10))
plt.savefig("Task1/image1/T2.png")
plt.show()
# ********** End **********#
第二关:线形图
任务描述:
本关任务:学习掌握matplotlib
的第一个图形线形图,并能够使用线形常用配置。
相关知识:
为了完成本关任务,你需要掌握:1.如何绘制线形图,2.如何为线形图设置颜色风格和坐标轴。
- 适用场景: 折线图适合二维的大数据集,尤其是那些趋势比单个数据点更重要的场合。它还适合多个二维数据集的比较。
一、绘制线形图
在所有图形中,最简单的应该就是线性方程y = f (x)
的可视化了。来看看如何创建这个简单的线形图。要画Matplotlib
图形时,都需要先创建一个图形fig
和一个坐标轴ax
。创建图形与坐标轴的最简单做法是:
import matplotlib.pyplot as plt#导入模块
plt.style.use('seaborn-whitegrid')#设置matplotlib画图样式
fig = plt.figure()
ax = plt.axes()
在Matplotlib
中,figure
(plt.Figure
类的一个实例)可以被看成是个能够容纳各种坐标轴、图形、文字和标签的容器。就像你在图中看到的那样,axes
(plt.Axes
类的一个实例)是一个带有刻度和标签的矩形,最终会包含所有可视化的图形元素。
在这里我们一般使用变量fig
表示一个图形实例,用变量ax
表示一个坐标轴实例。接下来使用ax.plot
画图,从简单的正弦曲线开始:
fig = plt.figure()
ax = plt.axes()
x = np.linspace(0, 10, 1000)
ax.plot(x, np.sin(x))
也可以使用pylab
接口画图,这时图形与坐标轴都在底层执行,执行结果和上图一样:plt.plot(x, np.sin(x))
试想下如果我们重复调用plot
命令会发生什么,它会在一张图中创建多条线:
plt.plot(x, np.sin(x))
plt.plot(x, np.cos(x))
二、设置颜色和风格
在画图的过程中通常对图形的第一次调整是调整它线条的颜色与风格。
plt.plot()
函数可以通过相应的参数设置颜色和风格,修改颜色使用color
参数,它支持各种颜色值的字符串,具体使用如下:
plt.plot(x, np.sin(x - 0), color='blue') # 标准颜色名称
plt.plot(x, np.sin(x - 1), color='g') # 缩写颜色代码(rgbcmyk)
plt.plot(x, np.sin(x - 2), color='0.75') # 范围在0~1的灰度值
plt.plot(x, np.sin(x - 3), color='#FFDD44') # 十六进制(RRGGBB,00~FF)
plt.plot(x, np.sin(x - 4), color=(1.0,0.2,0.3)) # RGB元组,范围在0~1
plt.plot(x, np.sin(x - 5), color='chartreuse') # HTML颜色名称
常用颜色对应值:
取值 | 颜色 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
如果不指定颜色,matplotlib
会为多条线自动循环使用一组默认的颜色。设置样式使用linestyle
参数:
plt.plot(x, x + 0, linestyle='solid')
plt.plot(x, x + 1, linestyle='dashed')
plt.plot(x, x + 2, linestyle='dashdot')
plt.plot(x, x + 3, linestyle='dotted')
#也可以用下面的简写形式
plt.plot(x, x + 4, linestyle='-') # 实线
plt.plot(x, x + 5, linestyle='--') # 虚线
plt.plot(x, x + 6, linestyle='-.') # 点划线
plt.plot(x, x + 7, linestyle=':') # 实点线
还可以将linestyle
和color
编码组合起来,作为plt.plot()
函数的一个非关键字参数使用:
plt.plot(x, x + 0, '-g') # 绿色实线
plt.plot(x, x + 1, '--c') # 青色虚线
plt.plot(x, x + 2, '-.k') # 黑色点划线
plt.plot(x, x + 3, ':r'); # 红色实点线
三、设置坐标轴上下限
虽然matplotlib
会自动为你的图形选择最合适的坐标轴上下限,但是有时自定义坐标轴上下线可能会更好。调整坐标轴上下限最基础的方式是plt.xlim()
和plt.ylim()
:
plt.plot(x, np.sin(x))
plt.xlim(-1, 11)
plt.ylim(-1.5, 1.5)
如果你想要让坐标轴逆序显示,那么只需要逆序设置坐标轴刻度值就可以了。matplotlib
还有一个方法是plt.axis()
。通过传入[xmin
,xmax
,ymin
,ymax
]对应的值,这样就可以用一行代码设置x
和y
的限值:
plt.plot(x, np.sin(x))
plt.axis([-1, 11, -1.5, 1.5])
还支持按照图形的内容自动收紧坐标轴,不留空白区域:
plt.plot(x, np.sin(x))
plt.axis('tight')
四、设置图形标签
图形标签与坐标轴标题是最简单的标签,设置方法如下:
plt.plot(x, np.sin(x))
plt.title("A Sine Curve")
plt.xlabel("x")
plt.ylabel("sin(x)");
编程要求:
在右侧编辑器Begin-End
补充代码,根据输入数据input_data
,input_data1
绘制两条折线图。依次为两组数据设置颜色样式为--g
,:r
;设置图例为L1
,L2
,具体要求如下:
- 折线图的
figsize
为(10, 10)
; - 图形保存到
Task2/img/T1.png
。
测试说明:
平台会对你编写的代码进行测试:
预期输出:你的答案与正确答案一致
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
def student(input_data,input_data1):
# ********* Begin *********#
fig = plt.figure(figsize=(10,10))
plt.plot(input_data,'--g')
plt.plot(input_data1,':r')
plt.legend(['L1','L2'])
plt.savefig("Task2/img/T1.png")
plt.show()
# ********* End *********#
第三关:散点图
任务描述:
本关任务:编写一个包含三组不同样式的散点图。
相关知识:
为了完成本关任务,你需要掌握:1.两种绘制散点图的方法,2.散点图常用的配置项。
- 适用场景:散点图适用二维或三维的数据集。比如相关性分析、 数据分布情况。
一、plot绘制散点图
散点图也是在数据科学中常用图之一,前面我们学习了使用plt.plot/ax.plot
画线形图的方法。同样的,现在用这些函数来画散点图:
x = np.linspace(0, 10, 30)
y = np.sin(x)
plt.plot(x, y, 'o', color='black')
函数的第三个参数是一个字符,表示图形符号的类型。与我们之前用-
和--
设置线条属性类似,对应的图形标记也有缩写形式。
rng = np.random.RandomState(0)
for marker in ['o', '.', ',', 'x', '+', 'v', '^', '<', '>', 's', 'd']:
plt.plot(rng.rand(5), rng.rand(5), marker,label="marker='{0}'".format(marker))
plt.legend(numpoints=1)
plt.xlim(0, 1.8);
plt.savefig("T1.png")
plt.show()
常用标记如下:
取值 | 含义 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plt.plot
函数非常灵活,可以满足各种不同的可视化配置需求。关于具体配置的完整描述,由于篇幅有限,请参考plt.plot
文档,这里就不多介绍了,大家多多尝试就好。
二、scatter画散点图
另一个可以创建散点图的函数是plt.scatter
。它的功能非常强大,其用法与plt.plot
函数类似:
x = np.linspace(0, 10, 30)
y = np.sin(x)
plt.scatter(x, y, marker='o');
结果和前面plt.plot
画的一样。plt.scatter
和plt.plot
的主要差别在于,前者在创建散点图时具有更高的灵活性,可以单独控制每个散点与数据匹配,也可以让每个散点具有不同的属性(大小、颜色等)。
接下来画一个随机散点图,里面有各种颜色和大小的散点。为了能更好的显示重叠部分,用alpha
参数来调整透明度:
rng = np.random.RandomState(0)
x = rng.randn(100)
y = rng.randn(100)
colors = rng.rand(100)
sizes = 1000 * rng.rand(100)
plt.scatter(x, y, c=colors, s=sizes, alpha=0.3,
cmap='viridis')
plt.colorbar() # 显示颜色条
这里散点的大小以像素为单位。颜色为浮点数,自动映射成颜色条(color scale
,通过colorbar()
显示)。当取值为浮点数时,它所对应的颜色则是对应的colormap
上对应长度的取值,colormap
就像以下这样的条带:
这样,散点的颜色与大小就可以在可视化图中显示多维数据的信息了。例如,可以使用sklearn
程序库中的鸢尾花数据来演示。它里面有三种花,每个样本是一种花,其花瓣与花萼的长度与宽度都经过了测量:
from sklearn.datasets import load_iris
iris = load_iris()
features = iris.data.T#加载数据
plt.scatter(features[0], features[1], alpha=0.2,
s=100*features[3], c=iris.target, cmap='viridis')
plt.xlabel(iris.feature_names[0])
plt.ylabel(iris.feature_names[1]);
散点图可以让我们同时看到不同维度的数据:每个点的坐标值(x
, y
)分别表示花萼的长度和宽度,而点的大小表示花瓣的宽度,三种颜色对应三种不同类型的鸢尾花。
这类多颜色与多特征的散点图在探索与演示数据时非常有用。
三、plot与scatter效率对比
plot
与scatter
除了特征上的差异之外,在数据量较大时,plot
的效率将大大高于scatter
。
这时由于scatter
会对每个散点进行单独的大小与颜色的渲染,因此渲染器会消耗更多的资源。而在plot
中,散点基本都彼此复制,因此整个数据集中的所有点的颜色、大小只需要配置一次。所以面对大型数据集时,plot
方法比scatter
方法好。
编程要求:
在右侧编辑器补充代码,根据输入的三组数据绘制三组不同参数的散点图,具体要求如下:
- 第一组数据参数设置标记大小为
area
,透明度为0.5
; - 第二组数据参数设置标记大小为
area
,标记颜色为绿色,透明度为0.6
; - 第三组数据参数设置标记大小为
area
,标记颜色为area
,标记样式为v
,透明度为0.7
; - 图形的
figsize
为(10, 10)
; - 图形保存到
Task3/img/T1.png
。
测试说明:
平台会对你编写的代码进行测试,因此请按照以下要求可视化:
预期输出:你的答案与正确答案一致
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
import numpy as np
def student(x,y,x2,y2,x3,y3,area):
'''
根据输入的三组数据绘制三组不同参数的散点图
:param x,y: 第一组数据,类型为array
:param x2,y2: 第二组数据,类型为array
:param x3,y3: 第三组数据,类型为array
:param area: 标记大小参数的值,类型为array
:return: None
'''
# ********* Begin *********#
fig = plt.figure(figsize=(10,10))
plt.scatter(x,y,s = area, alpha = 0.5)
plt.scatter(x2,y2,s = area, c = 'g', alpha = 0.6)
plt.scatter(x3,y3,s = area, marker = 'v', alpha = 0.7)
plt.savefig("Task3/img/T1.png")
plt.show()
# ********* End *********#
第四关:直方图
任务描述:
本关任务:绘制一个包含直方图与线形图的图形。
相关知识:
为了完成本关任务,你需要掌握:1.直方图和条形图的区别,2.如何绘制直方图。
- 适用场景:和柱状图类似,适合用于展示二维数据集,展示数据的分布情况,其中一个轴表示需要对比的分类维度,另一个轴代表相应的数值。
一、什么是直方图
单从外表上看直方图和条形图非常相似。首先需要区分清楚概念:直方图和条形图。
- 条形图用长条形表示每一个类别,长条形的长度表示类别的频数,宽度表示表示类别。
- 直方图是一种统计报告图,形式上也是一个个的长条形,但是直方图用长条形的面积表示频数,所以长条形的高度表示频数组距,宽度表示组距,其长度和宽度均有意义。当宽度相同时,一般就用长条形长度表示频数。
二、绘制直方图
直方图一般用来描述等距数据。直观上,直方图各个长条形是衔接在一起的,表示数据间的数学关系。
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
# 设置matplotlib正常显示中文和负号
matplotlib.rcParams['font.sans-serif']=['SimHei'] # 用黑体显示中文
matplotlib.rcParams['axes.unicode_minus']=False # 正常显示负号
# 随机生成(10000,)服从正态分布的数据
data = np.random.randn(10000)
plt.hist(data,bins=30, normed=0, facecolor="red", alpha=0.7)
# 显示横轴标签
plt.xlabel("区间")
# 显示纵轴标签
plt.ylabel("频数/频率")
# 显示图标题
plt.title("频数/频率分布直方图")
参数 | 作用 |
| 必选参数,绘图数据 |
| 直方图的长条形数目,可选项,默认为 |
| 是否将得到的直方图向量归一化,可选项,默认为 |
| 长条形的颜色 |
| 长条形边框的颜色 |
| 透明度 |
编程要求:
在右侧编辑器Begin-End
处补充代码,根据输入数据将直方图与线形图绘制在同一面板中,并设置直方图为红色,线形图为蓝色,具体要求如下:
- 图形的
figsize
为(10, 10)
; - 文件名为
Task4/img/T1.png
。
测试说明:
平台会对你编写的代码进行测试:
预期输出:你的答案与正确答案一致
import matplotlib
matplotlib.use("Agg")
import numpy as np
import matplotlib.pyplot as plt
def student(data,x,y):
'''
根据输入数据将直方图与线形图绘制在同一面板中,并设置直方图为红色,线形图为蓝色
:param data: 绘制直方图数据,类型为list
:param x,y: 绘制线形图数据,类型为list
:return: None
'''
# ********* Begin *********#
fig = plt.figure(figsize=(10,10))
plt.hist(data,facecolor="red")
plt.plot(x,y,color="blue")
plt.savefig("Task4/img/T1.png")
plt.show()
# ********* End *********#
第五关:饼图
任务描述:
本关任务:绘制一个饼图。
相关知识:
为了完成本关任务,你需要掌握:1.饼图的作用,2.如何绘制饼图。
- 适用场景:适用于二维数据,即一个分类字段,一个连续数据字段,当用户更关注与简单占比时,适合使用饼图。
一、饼图
饼图又称圆饼图、圆形图等,它是利用圆形及圆内扇形面积来表示数值大小的图形。饼图主要用于总体中各组成部分所占比重的研究。
二、绘制饼图
matplotlib
用来绘制饼图的函数是pie()
。常用参数如下:
参数 | 作用 |
| (每一块的比例,如果 |
| 饼图外侧显示的说明文字 |
| (每一块)离开中心距离 |
| 起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起 |
| 在饼图下面画一个阴影。默认值: |
| 控制饼图内百分比设置 |
| 控制饼图半径,默认值为1 |
| 字典类型,可选参数,默认值: |
labels = 'A','B','C','D'
sizes = [10,20,10,60]
plt.pie(sizes,labels=labels,explode = (0,0.1,0,0),autopct='%1.1f')
plt.show()
三、嵌套饼图
嵌套饼图通常被称为空心饼图图表。空心饼图形状的效果是通过wedgeprops
参数设置馅饼楔形的宽度来实现的:
fig, ax = plt.subplots()
size = 0.3
vals = np.array([[60., 32.], [37., 40.], [29., 10.]])
cmap = plt.get_cmap("tab20c")
outer_colors = cmap(np.arange(3)*4)
inner_colors = cmap(np.array([1, 2, 5, 6, 9, 10]))
ax.pie(vals.sum(axis=1), radius=1, colors=outer_colors,
wedgeprops=dict(width=size, edgecolor='w') )
ax.pie(vals.flatten(), radius=1-size, colors=inner_colors,
wedgeprops=dict(width=size, edgecolor='w'))
ax.set(aspect="equal" )
编程要求:
在右侧编辑器Begin-End
处补充代码,根据输入数据labels
、quants
绘制饼图,并设置第二块突出0.1
和显示各块的百分比,具体要求如下:
- 输入数据
labels
、quants
为长度为10
的列表 - 图形的
figsize
为(6, 6)
- 文件名为
Task5/img/T1.png
测试说明:
平台会对你编写的代码进行测试:
预期输出:你的答案与正确答案一致
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
def student(labels,quants):
# ********* Begin *********#
fig=plt.figure(figsize=(6,6))
sizes = quants
plt.pie(sizes,labels=labels,explode=(0,0.1,0,0,0,0,0,0,0,0),autopct='%1.1f%%')
plt.savefig("Task5/img/T1.png")
plt.show()
# ********* End *********#