系列文章
机器学习入门 01 —— 机器学习概述 机器学习入门 02 —— 环境搭建(Jupyter Notebook 及扩展库的安装与使用) 机器学习入门 03 —— Matplotlib使用
3.1 Matplotlib之Hello World
1 Matplotlib介绍
?
2 Matplotlib画图流程
?
import matplotlib.pyplot as plt
plt.figure(figsize=(5,3), dpi=100)
plt.plot([1,2,3,4,5],[17,17,18,15,11])
plt.show()
效果:
图像结构:
?
3.2 基础绘图功能(以折线图为例)
?
1 坐标刻度、标签、网格、图像保存
下面是常用功能演示:
说明下,里面用到了列表生成式,[random.uniform(15, 18) for i in x] ,相当于是遍历了60次(因为x长度60),每次获取[15,18)间的一个数,最后得到一个列表。
import matplotlib.pyplot as plt
import random
x = range(60)
y = [random.uniform(15, 18) for i in x]
plt.figure(figsize=(10, 6), dpi=100)
plt.plot(x, y)
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])
plt.grid(True, linestyle='--', alpha=0.5)
plt.xlabel("时间", fontsize=20)
plt.ylabel("温度", fontsize=20)
plt.title("中午11点0分到12点之间的温度变化图示", fontsize=20)
plt.savefig('temp.png')
plt.show()
效果:
可能很多人在进行中文标签显示时出现了乱码,这是因为Matplotlib的默认字体并不支持中文,所以需要我们对字体进行切换。解决方法请看我另一篇博客:解决Matplotlib中文乱码问题
2 在一个坐标系里绘制多个图
?
代码:
import matplotlib.pyplot as plt
import random
x = range(60)
y1 = [random.uniform(15, 18) for i in x]
y2 = [random.uniform(3, 6) for i in x]
plt.figure(figsize=(10, 6), dpi=100)
plt.plot(x, y1, label="第一条")
plt.plot(x, y2, color='y', linestyle='--', label="第二条")
plt.legend(loc='best')
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
plt.xticks(x[::5], x_ticks_label[::5])
plt.yticks(y_ticks[::5])
plt.grid(True, linestyle='--', alpha=0.5)
plt.xlabel("时间", fontsize=20)
plt.ylabel("温度", fontsize=20)
plt.title("中午11点0分到12点之间的温度变化图示", fontsize=20)
plt.savefig('temp.png')
plt.show()
效果:
3 在一个图里绘制多个坐标系
?
前面是面向过程,这里使用到了对象,所以有点区别。在这里,主要是用set方法进行设置。
代码:
import matplotlib.pyplot as plt
import random
x = range(60)
y1 = [random.uniform(15, 18) for i in x]
y2 = [random.uniform(3, 6) for i in x]
fig, axes = plt.subplots(nrows=1,ncols=2, figsize=(20, 8), dpi=100)
axes[0].plot(x, y1, label="第一条")
axes[1].plot(x, y2, color='y', linestyle='--', label="第二条")
axes[0].legend(loc='best')
axes[1].legend(loc='best')
x_ticks_label = ["11点{}分".format(i) for i in x]
y_ticks = range(40)
axes[0].set_xticks(x[::5])
axes[0].set_yticks(y_ticks[::5])
axes[0].set_xticklabels(x_ticks_label[::5])
axes[1].set_xticks(x[::5])
axes[1].set_yticks(y_ticks[::5])
axes[1].set_xticklabels(x_ticks_label[::5])
axes[0].grid(True, linestyle='--', alpha=0.5)
axes[1].grid(True, linestyle=':', alpha=0.5)
axes[0].set_xlabel("时间")
axes[0].set_ylabel("温度")
axes[0].set_title("中午11点0分到12点之间的温度变化图示", fontsize=10)
axes[1].set_xlabel("时间")
axes[1].set_ylabel("温度")
axes[1].set_title("中午11点0分到12点之间的温度变化图示", fontsize=10)
plt.savefig('temp.png')
plt.show()
效果:
?
3.3 常见图形绘制
?
官方链接:https://matplotlib.org/index.html
1 折线图
?
特点:能够显示数据的变化趋势,反映食物的变化情况。(变化)
Api:plt.plot(x, y)
前面的举例都是折线图,这里就不再说明了。
?
2 散点图
?
特点:判断变量之间是否存在数量关联趋势,展示离群点。(分布规律)
Api:plt.scatter(x, y)
x = [225.98, 247.07, 253.14, 457.85, 241.58, 301.01, 20.67,
288.64, 163.56, 120.06, 207.83, 342.75, 147.9 , 53.06,
224.72, 29.51, 21.61, 483.21, 245.25, 399.25, 343.35]
y = [196.63, 203.88, 210.75, 372.74, 202.41, 247.61, 24.9 ,
239.34, 140.32, 104.15, 176.84, 288.23, 128.79, 49.64,
191.74, 33.1 , 30.74, 400.02, 205.35, 330.64, 283.45]
plt.figure(figsize=(20, 8), dpi=100)
plt.scatter(x, y)
plt.show()
?
3 柱状图
?
特点:能够一眼看出各个数据的大小,比较数据之间的差别。(统计/对比)
Api:plt.bar(x, width, align='center'对齐, color='r')
movie_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴','降魔传','追捕','七十七天','密战','狂兽']
x = range(len(movie_name))
y = [73853,57767,22354,15969,14839,8725,8716,8318,7916,6764]
plt.figure(figsize=(20, 8), dpi=100)
plt.bar(x, y, width=0.5, color=['b','r','g','y','c','m','y','k','c','g'])
plt.xticks(x, movie_name)
plt.grid(linestyle="--", alpha=0.5)
plt.title("电影票房收入对比")
plt.show()
?
4 直方图
?
特点:绘制连续性的数据,展示一组或多组数据的分布状况(统计)
Api:plt.hist(x, bins=None组距)
import numpy as np
data = np.random.randn(10000)
"""
绘制直方图
data:必选参数,绘图数据
bins:直方图的长条形数目,可选项,默认为10
density:是否将得到的直方图向量归一化,可选项,默认为0,代表不归一化,显示频数。normed=1,表示归一化,显示频率。
facecolor:长条形的颜色
edgecolor:长条形边框的颜色
alpha:透明度
"""
plt.hist(data, bins=40, density=0, facecolor="blue", edgecolor="black", alpha=0.7)
plt.xlabel("区间")
plt.ylabel("频数/频率")
plt.title("频数/频率分布直方图")
plt.show()
?
5 饼图
?
特点:分类数据的占比情况(占比)
Api:plt.pie(x, label=每部分名称, autopct=占比显示, colors=每部分颜色
label_list = ["第一部分", "第二部分", "第三部分"]
size = [55, 35, 10]
color = ["red", "green", "blue"]
explode = [0.05, 0, 0]
"""
绘制饼图
explode:设置各部分突出
label:设置各部分标签
labeldistance:设置标签文本距圆心位置,1.1表示1.1倍半径
autopct:设置圆里面文本
shadow:设置是否有阴影
startangle:起始角度,默认从0开始逆时针转
pctdistance:设置圆内文本距圆心距离
返回值
l_text:圆内部文本,matplotlib.text.Text object
p_text:圆外部文本
"""
patches, l_text, p_text = plt.pie(size, explode=explode, colors=color, labels=label_list, labeldistance=1.1, autopct="%1.1f%%", shadow=False, startangle=90, pctdistance=0.6)
plt.axis("equal")
plt.legend()
plt.show()
6 特殊柱状图
两条柱状图
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
label_list = ['2014', '2015', '2016', '2017']
num_list1 = [20, 30, 15, 35]
num_list2 = [15, 30, 40, 20]
x = range(len(num_list1))
"""
绘制条形图
x:长条形中点横坐标
y:长条形高度
width:长条形宽度,默认值0.8
label:为后面设置legend准备
"""
rects1 = plt.bar(x, num_list1, width=0.4, alpha=0.8, color='red', label="一部门")
rects2 = plt.bar([i + 0.4 for i in x], num_list2, width=0.4, color='green', label="二部门")
plt.ylim(0, 50)
plt.ylabel("数量")
"""
设置x轴刻度显示值
参数一:中点坐标
参数二:显示值
"""
plt.xticks([index + 0.2 for index in x], label_list)
plt.xlabel("年份")
plt.title("某某公司")
plt.legend()
for rect in rects1:
height = rect.get_height()
plt.text(rect.get_x() + rect.get_width() / 2, height+1, str(height), ha="center", va="bottom")
for rect in rects2:
height = rect.get_height()
plt.text(rect.get_x() + rect.get_width() / 2, height+1, str(height), ha="center", va="bottom")
plt.show()
水平柱状图
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
price = [39.5, 39.9, 45.4, 38.9, 33.34]
"""
绘制水平条形图方法barh
参数一:y轴
参数二:x轴
"""
plt.barh(range(5), price, height=0.7, color='steelblue', alpha=0.8)
plt.yticks(range(5), ['亚马逊', '当当网', '中国图书网', '京东', '天猫'])
plt.xlim(30,47)
plt.xlabel("价格")
plt.title("不同平台图书价格")
for x, y in enumerate(price):
plt.text(y + 0.2, x - 0.1, '%s' % y)
plt.show()
堆叠柱状图
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
label_list = ['2014', '2015', '2016', '2017']
num_list1 = [20, 30, 15, 35]
num_list2 = [15, 30, 40, 20]
x = range(len(num_list1))
rects1 = plt.bar(x, num_list1, width=0.45, alpha=0.8, color='red', label="一部门")
rects2 = plt.bar(x, num_list2, width=0.45, color='green', label="二部门", bottom=num_list1)
plt.ylim(0, 80)
plt.ylabel("数量")
plt.xticks(x, label_list)
plt.xlabel("年份")
plt.title("某某公司")
plt.legend()
plt.show()
|