Matplotlib
是一个 Python
的 2D绘图库, 使用matplotlib
能够非常简单的可视化数据。在matplotlib
中使用最多的模块就是pyplot
。pyplot
非常接近Matlab
的绘图实现,而且大多数的命令及其类似Matlab
。在使用Matplotlib
的时候需要import这个模块:1
import matplotlib.pyplot as plot
由于matplotlib
默认字体没有中文,如果想让画图的标题支持中文的显示,必须手动添加中文字体方可,以下导入SimHei
字体:
1 | from pylab import mpl |
画图的时候还会依赖数组和矩阵等科学计算,所以会对numpy
产生依赖;所以还需要import numpy
;下面将以线图、柱状图、饼图、极坐标图和散点图等几种典型的图表,介绍pyplot这个模块的画图功能。
1. 单个图表的线图
画单个线图和MATLAB,其实基本是一样的,首先选择一个X轴的范围,然后在这个范围内把[x,y]在对应的坐标区间画出来。完整的代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15## 字体的默认设置没有中文,所以需要手动添加中文字体才能显示中文
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
import numpy as np
import matplotlib.pyplot as plot
##画单个图,多根线
def plotSignleImg():
x=np.arange(0,5,0.2) # X轴的范围,0-5,点的间距是0.2个单位
plot.plot(x,x**4,'r',x,x*90,'bs',x,x**3,'g^') ## 'r'红 'bs'蓝 'g^'绿
plot.show() # 显示画图结果
if __name__=='__main__':
plotSignleImg()
效果图:
2. 多个图表在一个图
在一个图表中画多个图,合画单个图的方式基本是一致的,唯一的区别就是,画多图的时候需要把画布分割成相应的块数,来放图表。如下例子,画两个图,需要命令plot.subplot(211)
和plot.subplot(212)
这两行代码中的数字前边两个必须一直,最后一个数代表图的位置,这里1
表示上边的位置,2
表示下边的例子。
1 | ## 画多个图,多根线 |
效果图:
3. 画直方图 (柱状图))
正态分布是大家接触最多的一种数据的呈现规则;这里以正态分布为例,介绍一下怎么画一个正态分布图的直方图;首先构造一组满足正态分布的数据,取分布在[0,1]
随机的1000
组数据,构造正态分布数据。x=mu+sigma*np.random.randn(1000)
从标准正态分布中返回n=1000个样本值,这1000个数值的大小随机在[0,1]。
1 | def plotHitImg(): |
这里plot.hist()函数中,
- bins将直方图的取值范围进行均等划分bings个区间;
- normed =1 表示将出现频次进行了归一化。 normed=0,则为频次;
- alpha表示直方图的透明度[0, 1] ;
- histtype = ‘stepfilled’ 表示去除条柱的黑色边框 , hist柱子类型
- rwidth= :柱子与柱子之间的距离,默认是0
- orientation:水平或垂直方向
plot.text()函数中,
- text(x,y,string,fontsize=15,verticalalignment=”top”,horizontalalignment=”right”)
- x,y:表示坐标值上的值 也就是字符串在图标的位置;
- string:表示说明文字
- fontsize:表示字体大小
- verticalalignment:垂直对齐方式,参数:[center|top|bottom|baseline]
- horizontalalignment:水平对齐方式,参数:[center|right|left]
效果图:
4. 画饼图
饼图,在分析数据时,主要呈现各份数据在总体的比例;相同颜色的数据标记组成一个数据系列。)显示为整个饼图的百分比。这里简单用水果的例子示意,总共有苹果、西瓜、猕猴桃和芒果等四种水果。它们分别占50%、12%、20%和18%。1
2
3
4
5
6
7
8
9def plotPieImg():
labels=['苹果','西瓜','芒果','猕猴桃']
size=[50,12,18,20]
explode=(0,0.0,0,0)
plot.pie(size,explode=explode,labels=labels,autopct='%1.1f%%',shadow=True,startangle=90,pctdistance = 0.6)
plot.axis('equal')
plot.legend() #画出标签的图
plot.show()
pyplot.pie()函数:patches,l_text,p_text = atplotlib.pyplot.pie()
参数 | 默认值 | 描述 |
---|---|---|
x | NA | 数组。输入的数据用于创建一个饼图。 |
explode | None | 数组,可选参数,维度为数据项的个数,如explode=(0,0.5,0,0) 第二个突出 |
labels | None | 列表,可选参数,为每个饼块的标记。维度为数据项个数。 |
colors | None | 数组,可选参数,用来标注每块饼图的颜色。None:将使用当前活动环的颜色。 |
autopct | None | 字符串或函数,可选参数。如果不是None,是一个字符串或函数用带有数值饼图标注。 |
pctdistance | 0.6 | 浮点数,可选参数,每个饼切片中心和通过autopct生成的文本开始之间的比例。如autopct是None,被忽略。 |
shadow | False | 布尔值,可选参数,在饼图下面画一个阴影。 |
labeldistance | 1.1 | 浮点数,可选参数,被画饼标记的直径。 |
startangle | None | 浮点类型,可选参数,如果不是None,从x轴逆时针旋转饼图的开始角度。 |
radius | None | 浮点类型,可选参数,饼图的半径,如果半径是None,将被设置成1。 |
counterclock | rue | 布尔值,可选参数,指定指针方向,顺时针或者逆时针。 |
wedgeprops | None | 字典类型,可选参数,参数字典传递给wedge对象用来画一个饼图.如:wedgeprops={‘linewidth’:3}线宽为3。 |
textprops | None | 字典类型,可选参数,传递给text对象的字典参数。 |
center | (0, 0) | 浮点类型的列表,可选参数,图标中心位置。 |
frame | False | 布尔类型,可选参数,如果是true,绘制带有表的轴框架。 |
rotatelabels | False | 布尔类型,可选参数,如果为True,旋转每个label到指定的角度。 |
hold | None | |
data | None |
返回值:
patches:列表。matplotlib.patches.Wedge实例列表。
text:列表。matplotlib.text.Text实例label的列表。
autotexts:列表。A是数字标签的Text实例列表。 仅当参数autopct不为None时才返回。
效果图:
5. 极坐标图
先简单说一下极坐标系:在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向)。对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r表示),θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对(ρ,θ)
就叫点M的极坐标,这样建立的坐标系叫做极坐标系。通常情况下,M的极径坐标单位为1(长度单位),极角坐标单位为rad(或°)。[参考 极坐标]。因此,画极坐标图,我们需要先建一个极坐标系,ax=plot.subplot(111,projection='polar')
利用subplot函数在当前的figure中建立一个极坐标系,返回针对这个subplot的一个坐标轴Axes对象。然后设置这个subplot
的bar,bar(left, height, width=0.8, bottom=None, **kwargs)
设置一个矩形框,大小限定在left
, left+width
, bottom
, bottom+height
的范围,left,bottom,height,width
四个参数决定位置和大小left决定了左边界,bottom决定了下边界,height决定了长度,width决定了宽度。对应到笛卡尔坐标系中,left决定了扇形的中线位置,然后height决定扇形的长度,bottom决定了下边界,width决定了扇形的宽度。
numpy中random.rand()和randn()
- random.randn(d0, d1, …, dn)是从标准正态分布中返回一个或多个样本值
- numpy.random.rand(d0, d1, …, dn)的随机样本位于[0, 1)中
1 | #面向对象的极坐标图绘制 |
zip()函数 将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
zip 方法在 Python2和 Python 3 中的不同:在 Python3 中为了减少内存,zip()
返回的是一个对象。如需展示列表,需手动 list() 转换。bar.set_facecolor()
窗口的背景颜色bar.set_edgecolor()
窗口的边框颜色plot.cm.viridis()
蓝-绿-黄colormapset_alpha()
设置透明度,同plot的alpha参数,透明度[0, 1]
alpha表示直方图的透明度[0, 1] ;
效果图:
6. 散点图
散点图,顾名思义就是在图中分布的各个没有连接的孤点,也就是把某些点在坐标中明晰的表示出来。在数据的二维和三维表示中,用来发现数据分类和排布很有作用。1
2
3
4
5
6
7#散点图
def plotScatterImg():
#返回值 fig : matplotlib.figure.Figure object ax : Axes object or array of Axes objects.
fig,ax=plot.subplots()
ax.plot(10*np.random.rand(10),10*np.random.rand(10),'o')
ax.set_title('简单散点图') #设置图标标题
plot.show()
效果图:
参考附表
python的颜色图谱(colormap), 例如在matplotlib.pyplot.imshow(X, cmap=None)
中
- X: 要绘制的图像或数组;
- cmap: 颜色图谱(colormap), 默认绘制为RGB(A)颜色空间。
颜色图谱 | 描述 | 颜色图谱 | 描述 |
---|---|---|---|
row 1 col 1 | row 1 col 2 | hsv | hsv颜色空间, 红-黄-绿-青-蓝-洋红-红 |
row 2 col 1 | row 2 col 2 | inferno | 黑-红-黄 |
autumn | 红-橙-黄 | jet | 蓝-青-黄-红 |
bone | 黑-白,x线 | magma | 黑-红-白 |
cool | 青-洋红 | pink | 黑-粉-白 |
copper | 黑-铜 | plasma | 绿-红-黄 |
flag | 红-白-蓝-黑 | prism | 红-黄-绿-蓝-紫-…-绿模式 |
gray | 黑-白 | spring | 洋红-黄 |
hot | 黑-红-黄-白 | summer | 绿-黄 |
viridis | 蓝-绿-黄 | winter | 蓝-绿 |
学习文献
[1] 官方教程 : https://matplotlib.org/users/pyplot_tutorial.html
[2] matplotlib详细介绍 https://blog.csdn.net/sunshine_in_moon/article/details/46573117
[3] matplotlib基础绘图函数示例 https://www.jianshu.com/p/ad14fee5fb60
[4]matplotlib极坐标方法详解 https://www.cnblogs.com/kallan/p/6738577.html