使用pyplot的plot()
函数可以快速绘制折线图。plot()
函数的语法格式如下:
plot(x, y, fmt, scalex=True, scaley=True, data=None, label=None, *args, **kwargs)
x:表示x轴的数据,默认值为range(len(y))。
**y:**表示y轴的数据。
**fmt:**表示快速设置线条样式的格式字符串。
**label:**表示应用于图例的标签文本。
plot()
函数会返回一个包含Line2D类对象(代表线条)的列表。
使用pyplot的plot()函数还可以绘制具有多个线条的折线图,通过以下任意一种方式均可以完成。
多次调用plot()
函数来绘制具有多个线条的折线图:
plt.plot(x1, y1)
plt.plot(x2, y2)
调用plot()
函数时传入一个二维数组来绘制具有多个线条的折线图,例如将二维数组arr的第一行数据作为x轴数据,其他行数据全部作为y轴数据:
arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12]])
plt.plot(arr[0], arr[1:])
调用plot()
函数时传入多组数据来绘制具有多个线条的折线图:
plt.plot(x1, y1, x2, y2)
**示例:**要求根据下表的数据,将日期列的数据作为x轴数据,将最高气温和最低气温两列的数据作为y轴数据,使用plot()
函数绘制下图所示的折线图。
根据图示我们可以得知:将“日期”这一列作为x轴数据,将“最高气温”和“最低气温”两列的数据作为y轴数据,代码实现如下:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(4, 19)
y_max = np.array([32, 33, 34, 34, 33, 31, 30, 29, 30,
29, 26, 23, 21, 25, 31])
y_min = np.array([19, 19, 20, 22, 22, 21, 22, 16, 18,
18, 17, 14, 15, 16, 16])
# 绘制折线图
plt.plot(x, y_max)
plt.plot(x, y_min)
plt.show()
运行结果如下:
使用pyplot的bar()
函数可以快速地绘制柱形图或堆积柱形图 。bar()
函数的语法格式如下:
bar(x, height, width=0.8, bottom=None, align=‘center’, tick_label=None, xerr=None, yerr=None, **kwargs)
bar()
函数会返回一个BarContainer
类的对象。BarContainer
类的对象是一个包含柱形或误差棒的容器,它亦可以视为一个元组,可以遍历获取每个柱形或误差棒。此外,BarContainer
类的对象也可以访问patches
或errorbar
属性分别获取图表中所有的柱形或误差棒。
例如,绘制以下柱形图:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(5)
y1 = np.array([10, 8, 7, 11, 13])
# 柱形的宽度
bar_width = 0.3
# 绘制柱形图
plt.bar(x, y1, tick_label=['a', 'b', 'c', 'd', 'e'], width=bar_width)
plt.show()
运行结果如下:
使用pyplot的bar()
函数还可以绘制具有多组柱形的柱形图,如下图:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(5)
y1 = np.array([10, 8, 7, 11, 13])
y2 = np.array([19, 6, 5, 10, 12])
# 柱形的宽度
bar_width = 0.3
# 根据多组数据绘制柱形图
plt.bar(x, y1, tick_label=['1月', '2月', '3月', '4月', '5月'],
width=bar_width)
plt.bar(x+bar_width, y2, width=bar_width)
plt.show()
bottom
参数传值的方式控制柱形的y值,使后悔之的柱形图位于先绘制的柱形的上方:plt.bar(x, y1, tick_label=['1月', '2月', '3月', '4月', '5月'],
width=bar_width)
# plt.bar(x+bar_width, y2, width=bar_width)
plt.bar(x, y2, bottom=y1, width=bar_width)
error = [2, 1, 2.5, 2, 1.5]
# 根据多组数据绘制柱形图
plt.bar(x, y1, tick_label=['1月', '2月', '3月', '4月', '5月'],
width=bar_width)
plt.bar(x, y2, bottom=y1, width=bar_width, yerr=error)
plt.show()
本实例要求根据下表的数据,将财年列的数据作为x轴数据,将GMV(一定时间内的成交总额)列的数据作为y轴数据,使用bar()函数绘制下图所示的柱形图。
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1, 8)
y = np.array([10770, 16780, 24440, 30920, 37670, 48200, 57270])
# 绘制柱形图
plt.bar(x, y, tick_label=['FY2013', 'FY2014', 'FY2015', 'FY2016',
'FY2017', 'FY2018', 'FY2019'], width=0.5)
plt.show()
使用pyplot的barh(
)函数可以快速地绘制条形图或堆积条形图 ,语法格式如下:
barh(y, width, height=0.8, left=None, align='center', *, **kwargs)
例如,绘制如下图形:
import numpy as np
import matplotlib.pyplot as plt
y = np.arange(5)
x1 = np.array([10, 8, 7, 11, 13])
# 条形的高度
bar_height = 0.3
# 绘制条形图
plt.barh(y, x1, tick_label=['a', 'b', 'c', 'd', 'e'],
height=bar_height)
plt.show()
barh()
函数还可以绘制具有多组条形的条形图:import numpy as np
import matplotlib.pyplot as plt
y = np.arange(5)
x1 = np.array([10, 8, 7, 11, 13])
x2 = np.array([9, 6, 5, 10, 12])
bar_height = 0.3
plt.barh(y, x1, tick_label=['a', 'b', 'c', 'd', 'e'], height=bar_height)
plt.barh(y+bar_height, x2, height=bar_height)
plt.show()
barh()
函数还可以通过给left参数传值的方式控制条形的x值,使后绘制的条形位于先绘制的条形的右方:plt.barh(y, x1, tick_label=['a', 'b', 'c', 'd', 'e'], height=bar_height)
# plt.barh(y+bar_height, x2, height=bar_height)
plt.barh(y, x2, left=x1, height=bar_height)
plt.show()
error = [2, 1, 2.5, 2, 1.5]
plt.barh(y, x1, tick_label=['a', 'b', 'c', 'd', 'e'], height=bar_height)
# plt.barh(y+bar_height, x2, height=bar_height)
plt.barh(y, x2, left=x1, height=bar_height, xerr=error)
plt.show()
网络购物已经成为人们日常生活的一部分,它在创造新的消费方式的同时,也在改变着人们的消费模式和习惯,成为拉动居民消费的重要渠道。国家统计局抽取了771个样本,并根据这些样本测算用户网购替代率(网购用户线上消费对线下消费的替代比率)的情况。
根据图示可以得知,将“商品种类”一列的数据作为y轴的刻度标签,将“替代率”一列的数据作为x轴的数据,具体代码如下:
import numpy as np
import matplotlib.pyplot as plt
# 显示中文
# 运行配置参数中的字体(font)为黑体(SimHei)
plt.rcParams['font.sans-serif'] = ['SimHei']
#运行配置参数总的轴(axes)正常显示正负号(minus)
plt.rcParams['axes.unicode_minus'] = False
x = np.array([0.959, 0.951, 0.935, 0.924, 0.893,
0.892, 0.865, 0.863, 0.860, 0.856,
0.854, 0.835, 0.826, 0.816, 0.798,
0.765, 0.763, 0.670])
y = np.arange(1, 19)
labels = ["家政、家教、保姆等生活服务", "飞机票、火车票", "家具",
"手机、手机配件", "计算机及其配套产品", "汽车用品", "通信充值、游戏充值",
"个人护理用品", "书报杂志及音像制品", "餐饮、旅游、住宿", "家用电器",
"食品、饮料、烟酒、保健品", "家庭日杂用品", "保险、演出票务",
"服装、鞋帽、家用纺织品", "数码产品", "其他商品和服务", "工艺品、收藏品"]
# 绘制条形图
plt.barh(y, x, tick_label=labels, align="center", height=0.6)
plt.show()
使用pyplot的stackplot()函数可以快速地绘制堆积面积图 ,语法格式为:
stackplot(x, y,labels=(), baseline='zero', data=None, *args, **kwargs)
**x:**表示x轴的数据,可以是一维数组。
**y:**表示y轴的数据,可以是二维数组或一维数组序列。
**labels:**表示每个填充区域的标签。
baseline:表示计算基线的方法,包括zero、sym、wiggle和weighted_wiggle。其中zero表示恒定零基线,即简单的叠加图;sym表示对称于零基线;wiggle表示最小化平方斜率之和;weighted_wiggle表示执行相同的操作,但权重用于说明每层的大小。
绘制如下图示:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(6)
y1 = np.array([1, 4, 3, 5, 6, 7])
y2 = np.array([1, 3, 4, 2, 7, 6])
y3 = np.array([3, 4, 3, 6, 5, 5])
# 绘制堆积面积图
plt.stackplot(x, y1, y2, y3)
plt.show()
近些年我国物流行业蓬勃房展,目前已经有近几千家物流公司,其中部分物流公司大打价格战,以更低的价格吸引更多的客户,从而抢占市场份额。 本实例要求根据下表的数据,将月份列的数据作为x轴的刻度标签,将A公司、B公司、C公司这三列数据作为y轴的数据,使用stackplot()函数绘制下图所示的堆积面积图。
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1, 13)
y_a = np.array([198, 215, 245, 222, 200, 236, 201, 253, 236, 200, 266, 290])
y_b = np.array([203, 236, 200, 236, 269, 216, 298, 333, 301, 349, 360, 368])
y_c = np.array([185, 205, 226, 199, 238, 200, 250, 209, 246, 219, 253, 288])
# 绘制堆积面积图
plt.stackplot(x, y_a, y_b, y_c)
plt.show()
使用pyplot的hist()函数可以快速地绘制直方图 ,语法格式如下:
hist(x, bins=None, range=None, density=None, weights=None,
bottom=None, **kwargs)
**x:**表示x轴的数据。
**bins:**表示矩形条的个数,默认为10。
**range:**表示数据的范围,若未设置范围,默认数据范围为(x.min(), x.max())。
**cumulative:**表示是否计算累计频数或频率。
**histtype:**表示直方图的类型,支持’bar’、‘barstacked’、‘step’、'stepfilled‘四种取值,其中’bar’为默认值,代表传统的直方图;'barstacked’代表堆积直方图;'step’代表未填充的线条直方图;'stepfilled’代表填充的线条直方图。
绘制如下直方图:
import numpy as np
import matplotlib.pyplot as plt
# 准备50个随机测试数据
scores = np.random.randint(0,100,50)
# 绘制直方图
plt.hist(scores, bins=8, histtype='stepfilled')
plt.show()
人脸识别技术是一种生物特征识别技术,它通过从装有摄像头的终端设备拍摄的人脸图像中抽取人的个性化特征,以此来识别人的身份。灰度直方图是实现人脸识别的方法之一,它将数字图像的所有像素按照灰度值的大小统计其出现的频率。
本实例要求使用一组10000个随机数作为人脸图像的灰度值,使用hist()函数绘制下图所示的灰度直方图。
import numpy as np
import matplotlib.pyplot as plt
# 10000个随机数
random_state = np.random.RandomState(19680801)
radom_x = random_state.randn(10000)
# 绘制包含25个矩形条的直方图
plt.hist(radom_x, bins=25)
plt.show()
使用pyplot的pie()
函数可以快速地绘制饼图或圆环图 ,语法格式如下:
pie(x, explode=None, labels=None, autopct=None, pctdistance=0.6,
startangle=None, *, data=None)
绘制圆环图:
pie(x, explode=None, labels=None, autopct=None, pctdistance=0.6,
startangle=None, *, data=None)
绘制饼图:
import numpy as np
import matplotlib.pyplot as plt
data = np.array([20, 50, 10, 15, 30, 55])
pie_labels = np.array(['A', 'B', 'C', 'D', 'E', 'F'])
# 绘制饼图:半径为0.5,数值保留1位小数
plt.pie(data, radius=1.5, labels=pie_labels, autopct='%3.1f%%')
plt.show()
绘制圆环图:
import numpy as np
import matplotlib.pyplot as plt
data = np.array([20, 50, 10, 15, 30, 55])
pie_labels = np.array(['A', 'B', 'C', 'D', 'E', 'F'])
# 绘制圆环图
plt.pie(data, radius=1.5, wedgeprops={'width': 0.7},
labels=pie_labels, autopct='%3.1f%%',
pctdistance=0.75)
plt.show()
近年来随着支付App的出现,人们的生活发生了翻天覆地的变化,无论是到超市选购商品,还是跟朋友聚餐,或是来一场说走就走的旅行,都可以使用移动支付App轻松完成支付,非常便捷。支付宝是人们使用较多的支付方式,它拥有自动记录每月账单的功能,可以方便用户了解每月资金的流动情况。
本实例要求根据下表的数据,将分类列的数据作为饼图的标签,将各分类对应的金额与总支出金额的比例作为饼图的数据,使用pie()函数绘制下图所示的饼图。
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
# 饼状图外侧文字说明
kinds = ['购物', '人情往来', '餐饮美食', '通信物流', '生活日用',
'交通通行', '休闲娱乐', '其他']
# 饼状图数据
money_scale = [800/3000, 100/3000, 1000/3000, 200/3000,
300/3000, 200/3000, 200/3000, 200/3000]
dev_position = [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]
# 饼图绘制
plt.pie(money_scale, labels=kinds, autopct='%3.1f%%', shadow=True,
explode=dev_position, startangle=90)
plt.show()
使用pyplot的scatter()
函数可以快速地绘制散点图或气泡图,语法格式如下:
scatter(x, y, s=None, c=None, marker=None, cmap=None, linewidths=None, edgecolors=None, *, **kwargs)
绘制散点图:
import numpy as np
import matplotlib.pyplot as plt
num = 50
x = np.random.rand(num)
y = np.random.rand(num)
plt.scatter(x, y)
plt.show()
绘制气泡图:
import numpy as np
import matplotlib.pyplot as plt
num = 50
x = np.random.rand(num)
y = np.random.rand(num)
area = (30 * np.random.rand(num))**2
plt.scatter(x, y, s=area)
plt.show()
汽车的制动距离主要取决于汽车的车速。若车速增加1倍,则汽车的制动距离将增大至近4倍。某汽车生产公司对一批丰田汽车进行抽样测试,并分别记录了不同的车速对应的制动距离。
本实例要求根据下表的数据,将车速(km/h)列的数据作为x轴的数据,将制动距离(m)列的数据作为y轴的数据,使用scatter()函数绘制下图所示的散点图。
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 准备x轴和y轴数据
x_speed = np.arange(10, 210, 10)
y_distance = np.array([0.5, 2.0, 4.4, 7.9, 12.3, 17.7,
24.1, 31.5, 39.9, 49.2, 59.5, 70.8,
83.1, 96.4, 110.7, 126.0, 142.2,
159.4, 177.6, 196.8])
# 绘制散点图
plt.scatter(x_speed, y_distance, s=50, alpha=0.9)
plt.show()
使用pyplot的boxplot()
函数可以快速地绘制箱形图,语法格式如下:
boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, *, data=None)
import numpy as np
import matplotlib.pyplot as plt
data = np.random.randn(100)
plt.boxplot(data, meanline=True, widths=0.3, patch_artist=True,
showfliers=False)
plt.show()
本实例要求根据下表的数据,将发电量(亿千瓦时)列的数据作为x轴的数据,将2017年和2018年作为y轴的刻度标签,使用boxplot()函数绘制下图所示的箱形图。
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
data_2018 = np.array([5200, 5254.5, 5283.4, 5107.8, 5443.3,
5550.6, 6400.2, 6404.9, 5483.1, 5330.2, 5543, 6199.9])
data_2017 = np.array([4605.2, 4710.3, 5168.9, 4767.2, 4947,
5203, 6047.4, 5945.5, 5219.6, 5038.1,
5196.3, 5698.6])
# 绘制箱型图
plt.boxplot([data_2018, data_2017], labels=('2018年', '2017年'),
meanline=True, widths=0.5, vert=False, patch_artist=True)
plt.show()
使用pyplot的polar()函数可以快速地绘制雷达图,语法格式如下:
polar(theta, r, **kwargs)
霍兰德职业兴趣测试是由美国职业指导专家霍兰德根据他本人大量的职业咨询经验及其职业类型理论编制的测评工具。
根据个人兴趣的不同,霍兰德将人格分为研究型(I)、艺术型(A)、社会型(S)、企业型(E)、传统型(C)和现实型(R)6个维度,将这6个维度不同程度的组合形成每个人的性格。
本实例要求根据下表的数据,将标题一行的数据作为雷达图的标签,将其余行的数据作为雷达图的数据,使用polar()函数绘制下图所示的雷达图。
由图可知,用户1偏向于现实型人格;用户2偏向于研究型人格;用户3偏向于艺术型人格;用户4偏向于企业型人格;用户5偏向于社会型人格;用户6偏向于传统型人格。
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
dim_num = 6
data = np.array([[0.40, 0.32, 0.35, 0.30, 0.30, 0.88],
[0.85, 0.35, 0.30, 0.40, 0.40, 0.30],
[0.43, 0.89, 0.30, 0.28, 0.22, 0.30],
[0.30, 0.25, 0.48, 0.85, 0.45, 0.40],
[0.20, 0.38, 0.87, 0.45, 0.32, 0.28],
[0.34, 0.31, 0.38, 0.40, 0.92, 0.28]])
angles = np.linspace(0, 2 * np.pi, dim_num, endpoint=False)
angles = np.concatenate((angles, [angles[0]]))
data = np.concatenate((data, [data[0]]))
# 维度标签
radar_labels = ['研究型(I)', '艺术性(A)', '社会性(S)',
'企业型(E)', '传统型(C)', '现实性(R)']
radar_labels = np.concatenate((radar_labels, [radar_labels[0]]))
# 绘制雷达图
plt.polar(angles, data)
# 设置极坐标的标签
plt.thetagrids(angles * 180/np.pi, labels=radar_labels)
# 填充多边形
plt.fill(angles, data, alpha=0.25)
plt.show()
使用pyplot的errorbar()函数可以快速地绘制误差棒图,语法格式如下:
errorbar(x, y, yerr=None, xerr=None, fmt='', ecolor=None, *, data=None, **kwargs)
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(5)
y = (25, 32, 34, 20, 25)
y_offset = (3, 5, 2, 3, 3)
plt.errorbar(x, y, yerr=y_offset, capsize=3, capthick=2)
plt.show()
细根生物量的多少反映了根系从土壤中吸收水分和养分的能力,是植物地下部分集汇能力的重要体现。不同树种细根生物量存在差异性,各树种细根生物量在不同季节间差异较为明显。
本实例要求根据下表的数据,将季节列的数据作为x轴的刻度标签,将其他列的数据作为y轴的数据,使用errorbar()函数绘制下图所示的误差棒图。
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 准备 x 轴和 y 轴的数据
x = np.arange(3)
y1 = np.array([2.04, 1.57, 1.63])
y2 = np.array([1.69, 1.61, 1.64])
y3 = np.array([4.65, 4.99, 4.94])
y4 = np.array([3.39, 2.33, 4.10])
# 指定测量偏差
error1 = [0.16, 0.08, 0.10]
error2 = [0.27, 0.14, 0.14]
error3 = [0.34, 0.32, 0.29]
error4 = [0.23, 0.23, 0.39]
bar_width = 0.2
# 绘制柱形图
plt.bar(x, y1, bar_width)
plt.bar(x + bar_width, y2, bar_width, align="center",
tick_label=["春季", "夏季", "秋季"])
plt.bar(x + 2*bar_width, y3, bar_width)
plt.bar(x + 3*bar_width, y4, bar_width)
# 绘制误差棒 : 横杆大小为 3, 线条宽度为 3, 线条颜色为黑色, 数据点标记为像素点
plt.errorbar(x, y1, yerr=error1, capsize=3, elinewidth=2, fmt=' k,')
plt.errorbar(x + bar_width, y2, yerr=error2, capsize=3, elinewidth=2, fmt='k,')
plt.errorbar(x + 2*bar_width, y3, yerr=error3, capsize=3, elinewidth=2, fmt='k,')
plt.errorbar(x + 2*bar_width, y3, yerr=error3, capsize=3, elinewidth=2, fmt='k,')
plt.show()
y4 = np.array([3.39, 2.33, 4.10])
error1 = [0.16, 0.08, 0.10]
error2 = [0.27, 0.14, 0.14]
error3 = [0.34, 0.32, 0.29]
error4 = [0.23, 0.23, 0.39]
bar_width = 0.2
plt.bar(x, y1, bar_width)
plt.bar(x + bar_width, y2, bar_width, align=“center”,
tick_label=[“春季”, “夏季”, “秋季”])
plt.bar(x + 2bar_width, y3, bar_width)
plt.bar(x + 3bar_width, y4, bar_width)
plt.errorbar(x, y1, yerr=error1, capsize=3, elinewidth=2, fmt=’ k,')
plt.errorbar(x + bar_width, y2, yerr=error2, capsize=3, elinewidth=2, fmt=‘k,’)
plt.errorbar(x + 2bar_width, y3, yerr=error3, capsize=3, elinewidth=2, fmt=‘k,’)
plt.errorbar(x + 2bar_width, y3, yerr=error3, capsize=3, elinewidth=2, fmt=‘k,’)
plt.show()