Python 除了擅长于数据抓取,把抓到的数据绘制成统计图形更是它的强项。
Matplotlib 是Python在2D绘图领域使用最广泛的组件,通过它可以让用户轻松地将数据图形化,并且提供了多种输出格式。Matplotlib功能强大,尤其在绘制各种科学图形方面更有非凡表现。
如果绘制的图形不是特别复杂,小巧的Bokeh组件就足以应付,它所需的资源大约只有Matplotlib的五分之一,却能绘出各种实用的图形,并可以在网页中进行呈现。
Matplotlib基本绘图
import matplotlib.pyplot as plt
Matplotlib绘图的主要功能是绘制x、y坐标图。绘图时,我们需要把x、y坐标保存在列表变量中并传给Matplotlib。例如,我们要绘制6个点:
listx = [1,5,7,9,13,16]
listy = [15,50,80,40,70,50]
x坐标的列表及y坐标的元素数目必须相同,否则执行时会产生“x and y must have same first dimension”的错误。
matplotlib.pyplot中绘制线形图的方法为plot(),其语法格式为:
包名.plot(x坐标列表, y坐标列表)
例如,我们要用listx及listy的列表进行绘图:
plt.plot(listx, listy)
绘图后如果不会自动显示,可用show()方法显示,例如:
plt.show()
执行结果如下:
plot()方法的参数及图形设置
matplotlib.pyplot包中的plot()方法,除了x坐标列表及y坐标列表为必需的参数外,还有数十个可选参数用于设置绘图的不同特性,下面是4个常用的可选参数:
- color:设置线条颜色。默认为蓝色,要设置线条为红色,则color=“red”。
- linewidth or lw:设置线条宽度。默认为1.0,如果要设置线条宽度为5.0,则linewidth=5.0。
- linestyle or ls:设置线条样式。可选值有"-"(实线)、"–"(虚线)、"-."(虚点线)及":"(点线),默认为"-"。
- label:设置图例名称,例如设置图例名称为money:label=“money”。此属性需搭配legend()方法使用才可生效。
例:绘制红色、虚线、线宽为5、名称为food的线形图。
plt.plot(listx, listy, color="red", lw=5.0, ls=="--", label="food")
设置好属性后,执行legend()方法进行显示:
plt.legend()
同时绘制多个图形
在同一个坐标系中可以绘制多个图形,我们通常会将所有图形都绘制完成后再显示。例如我们要绘制两个图形。
listx1 = [1,5,7,9,13,16]
listy1 = [15,50,80,40,70,50]
plt.plot(listx1, listy1)
listx2 = [2,6,8,11,14,16]
listy2 = [10,40,30,50,80,60]
plt.plot(listx2, listy2)
plt.show()
##### 图形的属性设置
图形绘制完成后,可对图形的属性做一些设置,如图形标题、x及y坐标轴标题等,这样可以让图形看起来更加直观。
设置图形的标题、x坐标轴标题、y坐标轴标题的语法分别为:
组件名称.title(图形标题)
组件名称.xlabel(x坐标标题)
组件名称.ylabel(y坐标标题)
例如:
plt.title("学生成绩") # 图形标题
plt.xlabel("座号") # x坐标标题
plt.ylabel("成绩") # y坐标标题
如果没有指定x坐标及y坐标范围,系统会根据数据大小判断最适合的x坐标及y坐标取值范围。我们也可以自行设置x、y的坐标范围,语法为:
组件.xlim(起始值, 终止值) # 设置x坐标范围
组件.ylim(起始值, 终止值) # 设置y坐标范围
例如设置x坐标范围为0到100,y坐标范围为0到50:
plt.xlim(0, 100) # 设置x坐标范围
plt.xlim(0, 50) # 设置y坐标范围
线形图的绘制
import matplotlib.pyplot as plt
listx1 = [1,5,7,9,13,16]
listy1 = [15,50,80,40,70,50]
plt.plot(listx1, listy1, label="Male")
listx2 = [2,6,8,11,14,16]
listy2 = [10,40,30,50,80,60]
plt.plot(listx2, listy2, color="red", linewidth=5.0, linestyle="--", label="Female")
plt.legend()
plt.xlim(0, 20)
plt.ylim(0, 100)
plt.title("Pocket Money")
plt.xlabel("Age")
plt.ylabel("Money")
plt.show()
在Matplotlib中显示中文
Matplotlib默认无法显示中文,所以在前面的例子中各种标题及图例使用的都是英文。若想在Matplotlib显示中文,只需将其默认使用的字体更改为简体中文即可。更改默认字体的操作方法有两种:
第一种方法是在文本编辑器中打开<\Anaconda3\Lib\sit-packages\matplotlib\mpl-data>matplotlibc文件,查找下面的文本行:
# font.sans-serif: ......
在冒号后面加上一个简体中文字体SimHei就可以了:
# font.sans-serif : SimHei, .......
第二种是直接在代码中导入pylab包,并把字体参数传递给配置文件:
from pylab import *
rcParams['font.sans-serif'] = ['SimHei']
绘制柱状图及饼图
Matplotlib除了可绘制线形图外,还可绘制柱状图或饼图。
柱状图的绘制是通过bar()方法来实线的,其语法为:
包名.bar(x坐标列表, y坐标列表, 其他参数...
绘制柱状图的参数与绘制线形图类似,除了一些线形图的属性参数(如线宽、线形等)不能使用外,其余参数在绘制柱状图时都可以使用。
柱状图绘制
import matplotlib.pyplot as plt
from pylab import *
rcParams['font.sans-serif'] = ['SimHei']
listx1 = [1,5,7,9,13,16]
listy1 = [15,50,80,40,70,50]
plt.bar(listx1, listy1, label="男性")
listx2 = [2,6,8,11,14,16]
listy2 = [10,40,30,50,80,60]
plt.bar(listx2, listy2, color="red", label="女性")
plt.legend()
plt.title("零花钱统计")
plt.xlabel("年龄")
plt.ylabel("零花钱数量")
plt.show()
绘制圆形饼图
饼图是用pie()方法来绘制的,其语法为:
包名.pie(数据列表[, 可选参数列表])
“数据列表”是列表型数据,可省略,其值作为饼图的数据源。
“可选参数列表”可有可无,其名称与功能如下:
- labels:由每个项目标题组成的列表。
- colors:由每个项目颜色组成的列表。
- explode:由每个项目的凸出值组成的列表。“0”表示不突出。
- labeldistance:项目标题与圆心的距离是半径的多少倍。例如“1.1”表示项目标题与圆心的距离是半径的1.1倍。
- autopct:项目百分比的格式,语法为“%格式%%”。例如“%2.1f%%”表示整数占2位,小数占1位。
- shadow:布尔值,True表示图形有阴影,False表示图形没有阴影。
- startangle:绘图的起始角度,绘图时按逆时针旋转顺序进行。
- pctdistance:百分比数值与圆心的距离是半径的多少倍。
默认绘制的饼图是椭圆形,若要绘制正圆形饼图,需用下列方法让x、y轴单位相等:
包名.axis("equal")
饼图的展示效果虽然不错,但仅适合少量数据的呈现,若将圆饼图分块太多,那么比例太小的数据就会看不清楚。
以饼图的方式表现东、南、北、中各区的业绩
import matplotlib.pyplot as plt
labels = ["东部","南部","北部","中部"]
sizes = [5, 10, 20, 15]
colors = ["red", "green", "blue", "yellow"]
explode = (0, 0, 0.05, 0)
plt.pie(sizes, explode=explode, labels=labels, colors=colors,\
labeldistance=1.1, autopct="%3.1f%%", shadow=True,\
startangle=90, pctdistance=0.6)
plt.axis("equal")
plt.legend()
plt.show()