
导入Matplotlib 库import matplotlib # 导入matplotlib库import matplotlib.pyplot as plt # 导入matplotlib库中的子模块pyplot并起别名为plt画布plt.figure1. 创建画布plt.figure(figsize(宽, 高), dpiNone)figsize画布大小元组给出dpi画布清晰度2. plt.title标题名plt.title(标题名) # 为当前子图添加标题有子图时使用plt.suptitle(画布标题名)给画布添加大标题3. 显示画布plt.show()4. 图片保存plt.savefigplt.savefig(文件路径字符串)例如plt.savefig(./图片.png)# 示例显示一个空白窗口 import matplotlib.pyplot as plt plt.figure(figsize(12, 9), dpi200) # 可选择返回为对象 # fig plt.figure(figsize(12, 9), dpi200) # 画布加上标题 plt.suptitle(suptitle) # 保存为图片文件 plt.savefig(./空白画布.png) # 显示画布 plt.show()子图plt.subplot1. 子图创建与选中plt.subplot(总子图行个数总子图列个数, 选择第几幅图)例如plt.subplot(2, 3, 4)表示创建二行三列共六个子图选中其中第四个(2行1列)的子图绘制在这句语句的下方写入绘制该幅子图的代码2. 添加子图1plt.subplot直接添加直接使用plt.subplot(总子图行个数总子图列个数, 第几幅图)来添加子图2fig.add_subplot添加fig plt.figure(figsize(4, 4), dpi200) # 注意要返回对象才可使用fig.add_subplotfig.add_subplot(总子图行个数总子图列个数, 第几幅图) # 添加子图建议全部使用plt.subplot()或先返回figplt.figure()再全部使用fig.add_subplot()来保持风格一致3. 子图标题有子图时使用 plt.suptitle(画布标题名) 给画布添加大标题在 plt.subplot(行, 列, 第几幅) 后使用 plt.title(子图标题名) 给当前子图添加标题# 示例绘制二行一列两个子图的画布 import matplotlib.pyplot as plt # 创建画布 plt.figure(figsize(12, 9), dpi200) # 画布大标题 plt.suptitle(suptitle) # 创建子图1 plt.subplot(2, 1, 1) # 子图1标题 plt.title(subplot1) # 创建子图2 plt.subplot(2, 1, 2) # 子图2标题 plt.title(subplot2) # 显示画布 plt.show()4. 子图间距调整plt.subplots_adjustplt.subplots_adjust(wspace宽间距, hspace高间距)例如plt.subplots_adjust(wspace0.5, hspace0.6)图表修饰1. x、y轴标签文本标记xlabel, ylabel, textplt.xlabel(x轴标签) # x轴添加标签plt.ylabel(y轴标签) # y轴添加标签plt.text(x坐标, y坐标, 文本, haleft) # 在(x, y)处标注文本, 默认水平左对齐(可改为center居中对齐)2. 中文字体与文本字号family, fontsize可在最后添加参数 family字体, fontsize字号 来显示中文字体与控制字号例如 plt.xlabel(x轴, familyKaiTi, fontsize20) # 字体为楷体字号20楷体KaiTi黑体SimHei仿宋FangSong隶书LiSu3. 全局字体设置因绘图中有些构件无法接收family参数需要全局指定字体matplotlib.rcParams[font.family] 字体名字符串matplotlib.rcParams[font.size] 数字例如matplotlib.rcParams[font.family] KaiTimatplotlib.rcParams[font.size] 12# 设置全局字体为楷体字号124. 网格线gridplt.grid() # 在绘图区域显示网格线5. x、y轴刻度xticks, yticksplt.xticks(x位置序列, 标注值名称序列)plt.yticks(y位置序列, 标注值名称序列)注这里的“序列”指可迭代对象如列表、数组等下同按序在对应数值处标注上标注值名称列表里的名称例如plt.xticks([-1, 0, 1, 2], [a1, a2, a3, a4])# 在x轴上-1位置标a10位置标a21位置标a32位置标a46. x、y轴绘图显示区域xlim, ylimplt.xlim(起, 止)plt.ylim(起, 止)只显示对应轴[起, 止]范围例如plt.xlim(-1, 1) # 只显示x轴[-1, 1]的范围折线图绘制plt.plot1. 折线图绘制函数plt.plot(x序列, y序列, 绘制参数)绘制参数如线的颜色k黑色r红色g绿色b蓝色y黄色w白色点的形状o圆圈.点s正方形D菱形d小菱形*星号线的形状-实线-.点线--长虚线:短虚线空字符无线条可按序连接后作为一个字符串传入例如 ko-- 表示黑色圆圈长虚线2. 添加图例plt.legendplt.plot(x序列, y序列, 绘制参数,label线条名称)在绘图指定label参数后用plt.legend()显示图例plt.legend(titleNone, locbest, fontsize字号数字)title可以用字符串指定图例的标题例如title标题loc默认为best自动选择不重叠的位置放图例还可为upper left等fontsize字号例如fontsize12以下例题绘制对于x[-7, -5, 0, 3, 6]几点y10sin(x)的折线图import numpy as np import matplotlib.pyplot as plt plt.figure(figsize(9, 5), dpi200) plt.title(sup标题, familySimHei, fontsize20) # 要画的x、y长度相同x[0]与y[0]组成第一个画的点以此类推 xs np.array([-7, -5, 0, 3, 6]) ys np.array(list(map(np.sin, xs))) * 10 # y10sin(x) # 绘制线形图 plt.plot(xs, ys, ko-, labely10sin(x)) # 黑色点实线标签结合图例使用 # 轴标签、刻度与显示范围 plt.xlabel(x轴, familyKaiTi, fontsize15) plt.ylabel(y轴, familyKaiTi, fontsize15) plt.xticks(xs, [x1, x2, x3, x4, x5], fontsize10) plt.yticks(ys, [y1, y2, y3, y4, y5], fontsize10) plt.xlim((-10, 10)) plt.ylim((-10, 10)) # 网格线 plt.grid() # 显示图例 plt.legend() plt.show()3. 在同一幅图绘制多条折线用两次plt.plot即可注意使用时要传入不同绘制参数例题对于x[-7, -5, 0, 3, 6]几点在同一画布上绘制y10sin(x)与y-10sin(x)的折线图import numpy as np import matplotlib.pyplot as plt plt.figure(figsize(9, 5), dpi200) plt.title(两条折线, familySimHei, fontsize20) x np.array([-7, -5, 0, 3, 6]) y1 np.array(list(map(np.sin, x))) * 10 y2 np.array(list(map(np.sin, x))) * (-10) # 同时绘制两条折线 plt.plot(x, y1, ro--, labely10sin(x)) plt.plot(x, y2, bD-., labely-10sin(x)) plt.xlabel(x轴, familyKaiTi, fontsize12) plt.ylabel(y轴, familyKaiTi, fontsize12) plt.xticks(x, [x1, x2, x3, x4, x5]) plt.xlim(-10, 10) plt.ylim(-10, 10) plt.grid() plt.legend() plt.show()4. 绘制多子图折线图在子图中分别绘制例题对于x[-7, -5, 0, 3, 6]几点绘制两幅垂直排列的子图子图1y10sin(x)与y-10sin(x)的折线图子图2y10cos(x)与y-10cos(x)的折线图import numpy as np import matplotlib.pyplot as plt # 数据准备 x np.array([-7, -5, 0, 3, 6]) y1 np.array(list(map(np.sin, x))) * 10 y2 np.array(list(map(np.sin, x))) * (-10) y3 np.array(list(map(np.cos, x))) * 10 y4 np.array(list(map(np.cos, x))) * (-10) # 画布 fig plt.figure(figsize(18, 9), dpi200) plt.suptitle(sin与cos对比, familySimHei, fontsize20) # 子图1 plt.subplot(2, 1, 1) plt.plot(x, y1, r.-., labely10sin(x)) plt.plot(x, y2, bd-., labely-10sin(x)) plt.title(sin图像, familySimHei, fontsize12) plt.xlabel(x轴, familySimHei, fontsize12) plt.ylabel(y轴, familySimHei, fontsize12) plt.xticks(x, [x1, x2, x3, x4, x5]) plt.xlim(-10, 10) plt.ylim(-10, 10) plt.legend() # 每个子图有自己独立的legend都需要调用 plt.grid() # 一个grid()同样 # 子图2 fig.add_subplot(2, 1, 2) plt.plot(x, y3, r.-., labely10cos(x)) plt.plot(x, y4, bd-., labely-10cos(x)) plt.title(cos图像, familySimHei, fontsize12) plt.xlabel(x轴, familySimHei, fontsize12) plt.ylabel(y轴, familySimHei, fontsize12) plt.xticks(x, [x1, x2, x3, x4, x5]) plt.xlim(-10, 10) plt.ylim(-10, 10) plt.legend() plt.grid() plt.subplots_adjust(hspace0.5) # 子图高间距 plt.show()直方图绘制plt.histplt.hist(序列, bins10)序列需要被画为直方图的数据bins分箱数默认为10可传入一个整数表示分箱数也可传入一个序列手动指定分箱边界例题随机生成100个[100, 200)范围的数字画分箱数为20的直方图import numpy as np import matplotlib.pyplot as plt nums np.random.randint(100, 200, 100) plt.figure(figsize(12, 8), dpi100) plt.suptitle(直方图, familySimHei, fontsize20) # 画直方图 plt.hist(nums, bins20) plt.show()条形图绘制plt.barplt.bar(x序列, y序列, width0.8, color, aligncenter, orientationvertical)x序列与y序列长度相同对应取出(x[i], y[i])对应一根x轴上x[i]处高为y[i]的柱width柱体宽度color柱体填充颜色align对齐方式center或edge。默认为center表示柱体中心对准x序列值edge表示柱体左边界对准x序列值orientation柱体方向vertical或horizontal。默认为vertical表示柱体垂直排列horizontal表示柱体水平排列1. text水平居中plt.text(x坐标, y坐标, 文本,hacenter) # 在(x, y)处标注文本, 使用水平居中对齐2. 绘制单序列条形图例题将省份Province [北京, 上海, 广东, 江苏, 重庆, 天津]及其GDPGDP [2.8, 3, 9, 8.6, 2, 1.9]虚拟数据绘制在一幅条形图中y轴为GDP值x轴体现省份名称并在柱体上方标注GDP的值import matplotlib.pyplot as plt import numpy as np plt.figure(figsize(12, 9), dpi200) plt.title(各省份GDP条形图, familySimHei, fontsize12) Province [北京, 上海, 广东, 江苏, 重庆, 天津] GDP [2.8, 3, 9, 8.6, 2, 1.9] # 条形图定位x序列 x_tick np.arange(6) # 绘制条形图 plt.bar(x_tick, GDP, colorr) plt.xticks(x_tick, Province, familyKaiTi, fontsize12) for i in range(6): # 文本水平对齐、垂直对齐 plt.text(x_tick[i], GDP[i]0.2, GDP[i], hacenter, familySimHei, fontsize12) plt.xlim(-1, 6) plt.ylim(0, 10) plt.grid() plt.show()3. 绘制多序列条形图例题将省份Province [北京, 上海, 广东, 江苏, 重庆, 天津]及其2020年GDPGDP20 [2.8, 3, 9, 8.6, 2, 1.9]、2021年GDPGDP21 [3.2, 4, 9.5, 5.6, 2.8, 4.9]虚拟数据绘制在一幅条形图中y轴为GDP值x轴体现省份名称并在柱体上方标注GDP的值import matplotlib.pyplot as plt import matplotlib import numpy as np Province [北京, 上海, 广东, 江苏, 重庆, 天津] GDP20 [2.8, 3, 9, 8.6, 2, 1.9] GDP21 [3.2, 4, 9.5, 5.6, 2.8, 4.9] widthh 0.4 x_tick1 np.arange(6) x_tick2 x_tick1 widthh matplotlib.rcParams[font.family] KaiTi plt.figure(figsize(12, 9), dpi200) plt.title(各省份20年与21年GDP对比图, familySimHei, fontsize20) plt.bar(x_tick1, GDP20, widthwidthh, color#ff00ff, label2020年) plt.bar(x_tick2, GDP21, widthwidthh, color#ffff00, label2021年) for i in range(6): plt.text(x_tick1[i], GDP20[i] 0.1, GDP20[i], familyKaiTi, fontsize12, hacenter) plt.text(x_tick2[i], GDP21[i] 0.1, GDP21[i], familyKaiTi, fontsize12, hacenter) plt.ylabel(GDP) plt.xticks(x_tick1 widthh / 2, Province, familyKaiTi, fontsize12) plt.legend() plt.grid() plt.show()4. 单、多序列条形图绘图归纳单序列width0.8, 两个序列width0.4, 三个序列width0.3较为美观练习题1以“populations.npz”为素材完成(a)、(b)题目的要求。本题要求在绘图之前先进行数据处理删去全为“nan”的行然后按年份“从小到大”排序做个切片就可以(a) 绘制总人口线形图。x轴是“年份”从起始年开始每隔4年绘制一个刻度。(b) 绘制多序列垂直条形图包括2个子图画上下的子图。第1个子图为“男女人口”第2个子图为“城乡人口”。x轴上的序列为2000年2005年2010年和2015年。# 本人思路供参考 import numpy as np import matplotlib import matplotlib.pyplot as plt f np.load(./populations.npz,allow_pickleTrue) print(f) names f[feature_names] data f[data] data data[-3::-1, :] print(names) print(data) # (a总人口线形图) p1 data[:, 1:2].flatten() year data[:, 0:1].flatten() # x轴刻度与标签 x_tick np.arange(0, len(p1), 4) xtick_labels year[::4] print(x_tick) print(xtick_labels) matplotlib.rcParams[font.family] KaiTi matplotlib.rcParams[font.size] 8 plt.figure(figsize(12, 6), dpi100) plt.plot(np.arange(len(p1)), p1, bo--, label总人口) plt.title(总人口线形图, familySimHei, fontsize15) plt.xlabel(年份, fontsize12) plt.ylabel(年末总人口(万人), fontsize12) plt.xticks(x_tick, xtick_labels) plt.legend() plt.grid() plt.show() # (b多序列垂直条形图) data2 data[4::5, :] man data2[:, 2:3].flatten() woman data2[:, 3:4].flatten() city data2[:, 4:5].flatten() country data2[:, 5:6].flatten() x_tick2 np.arange(4) xtick_labels2 [2000年, 2005年, 2010年, 2015年] matplotlib.rcParams[font.family] KaiTi matplotlib.rcParams[font.size] 8 fig plt.figure(figsize(7, 6), dpi100) plt.suptitle(男女、城乡人口对比图, familySimHei, fontsize15) # 条形宽度 bw 0.4 #子图1 plt.subplot(2, 1, 1) plt.bar(x_tick2, man, widthbw, colorr, label男) plt.bar(x_tick2bw, woman, widthbw, colorb, label女) for i in range(4): plt.text(x_tick2[i], man[i]100, %s%int(man[i]), hacenter) plt.text(x_tick2[i]bw, woman[i]100, %s%int(woman[i]), hacenter) plt.xticks(x_tick2bw/2, xtick_labels2) plt.xlim(-0.5, 4.2) plt.legend() #子图2 fig.add_subplot(2, 1, 2)# 此处仅为演示两种添加子图的方法均可建议统一风格 plt.bar(x_tick2, city, widthbw, colorr, label城镇) plt.bar(x_tick2bw, country, widthbw, colorb, label乡村) for i in range(4): plt.text(x_tick2[i], city[i]100, %s%int(city[i]), hacenter) plt.text(x_tick2[i]bw, country[i]100, %s%int(country[i]), hacenter) plt.xticks(x_tick2bw/2, xtick_labels2) plt.xlim(-0.5, 4.2) plt.legend() plt.show()饼图绘制plt.pieplt.pie(序列, labelsNone,autopctNone, startangleNone, labeldistance1.1, explodeNone)序列每一块的占比大小会自动根据sum(序列)归一化使得总占比和为1labels每一块对应的标签序列autopct设置百分比显示格式可用%width.precisionf%%(%补齐最小宽度.保留小数位数%%)例如autopct%.2f%%表示保留两位小数startangle开始绘制的角度默认图是从x轴正方向逆时针画起如设定startangle90则从y轴正方向逆时针画起labeldistance每块百分比标签离中心距离explode传入一个序列例如(0, 0.1, 0.2, 0)每个数字对应每块离开中心的距离例题根据[中专,大专,本科,硕士,其他]及其占比[0.2515, 0.3724, 0.3336, 0.0368, 0.0057]绘制饼图保留两位小数从y轴负方向开始画包括图例import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams[font.family] KaiTi # 因饼图绘图无法接收family参数需要全局指定 matplotlib.rcParams[font.size] 10 plt.figure(figsize(18, 9), dpi200) plt.title(各学历占比, familySimHei, fontsize20) labelss [中专,大专,本科,硕士,其他] sizes [0.2515, 0.3724, 0.3336, 0.0368, 0.0057] plt.pie(sizes, labelslabelss, autopct%.2f%%, startangle180) # 饼图本身已有labels显示一般不调用图例 plt.show()练习题2以“国民经济核算季度数据.npz”为素材绘制饼图要调整下起始角度不交到一块去包括4个子图2×2。第12个子图分别为2000年和2017年第一季度3个产业的GDP贡献额第34个子图分别为2000年和2017年第一季度各行业的GDP贡献额。import matplotlib import matplotlib.pyplot as plt import numpy as np f np.load(./国民经济核算季度数据.npz, allow_pickleTrue) print(f) columnss f[columns] data f[values] data data[:, 3:].astype(float) print(columnss) print(data) label1 [第一产业, 第二产业, 第三产业] label2 [农林牧渔业, 工业, 建筑业, 批发和零售业, 交通运输、仓储和邮政业, 住宿和餐饮业, 金融业, 房地产, 其他] data20_1 data[0, 0:3] data20_2 data[0, 3:] data17_1 data[-1, 0:3] data17_2 data[-1, 3:] matplotlib.rcParams[font.family] KaiTi matplotlib.rcParams[font.size] 5 fig plt.figure(figsize(10, 10), dpi200) plt.subplot(2, 2, 1) plt.pie(data20_1, labelslabel1, startangle90, autopct%.2f%%) plt.title(2000年第一季度GDP产业构成分布图) fig.add_subplot(2, 2, 2) # 为了演示这里先用plt.subplot后用fig.add_subplot。实际使用时应全用前者或后者统一风格 plt.pie(data17_1, labelslabel1, startangle90, autopct%.2f%%) plt.title(2017年第一季度GDP产业构成分布图) fig.add_subplot(2, 2, 3) plt.pie(data20_2, labelslabel2, startangle90, autopct%.2f%%) plt.title(2000年第一度GDP行业构成分布图) fig.add_subplot(2, 2, 4) plt.pie(data17_2, labelslabel2, startangle110, autopct%.2f%%) plt.title(2017年第一季度GDP行业构成分布图) plt.subplots_adjust(wspace0.6, hspace0.5) plt.show()散点图绘制plt.scatterplt.scatter(x序列, y序列, s20, cNone, markero, alphaNone, edgecolorsNone)x序列, y序列每个(xi, yi)对应绘制一个点s点的大小面积默认为20c点的颜色默认为蓝色marker点的形状默认为圆形alpha点的透明度edgecolors散点边界线的颜色练习题3以“iris.npz”为素材绘制散点图包括4个子图2×2。4个子图分别为“萼片(sepal)长度-花瓣(petal)长度”、“萼片宽度-花瓣宽度”、“萼片长度-萼片宽度”、“花瓣长度-花瓣宽度”散点图。为便于分析数据每个子图中要求用3种不同的颜色表示3种类别的花且要有图例# 本人思路仅供参考 import numpy as np import matplotlib import matplotlib.pyplot as plt # 数据准备 f np.load(./iris.npz, allow_pickleTrue) data f[data] features_name f[features_name] print(features_name) print(data) data1 data[:, [0, 2, 4]] data2 data[:, [1, 3, 4]] data3 data[:, [0, 1, 4]] data4 data[:, [2, 3, 4]] mask1 data1[:, 2] Iris-setosa mask2 data1[:, 2] Iris-versicolor mask3 data1[:, 2] Iris-virginica # 绘图 matplotlib.rcParams[font.family] KaiTi matplotlib.rcParams[font.size] 10 figplt.figure(figsize(10, 10), dpi200) ss 20 labels [setosa, versicolor, virginica] # 子图1 plt.subplot(221) plt.title(萼片长度-花瓣长度散点图) p11 data1[mask1] p12 data1[mask2] p13 data1[mask3] plt.scatter(p11[:, 0], p11[:, 1], sss, cr, labellabels[0]) plt.scatter(p12[:, 0], p12[:, 1], sss, cg, labellabels[1]) plt.scatter(p13[:, 0], p13[:, 1], sss, cb, labellabels[2]) plt.xlabel(萼片长度) plt.ylabel(花瓣长度) plt.legend() # 子图2 fig.add_subplot(222) # 此处仅为演示两种添加子图的方法均可 plt.title(萼片宽度-花瓣宽度散点图) p21 data2[mask1] p22 data2[mask2] p23 data2[mask3] plt.scatter(p21[:, 0], p21[:, 1], sss, cr, labellabels[0]) plt.scatter(p22[:, 0], p22[:, 1], sss, cg, labellabels[1]) plt.scatter(p23[:, 0], p23[:, 1], sss, cb, labellabels[2]) plt.xlabel(萼片宽度) plt.ylabel(花瓣宽度) plt.legend() # 子图3 fig.add_subplot(223) plt.title(萼片长度-萼片宽度散点图) p31 data3[mask1] p32 data3[mask2] p33 data3[mask3] plt.scatter(p31[:, 0], p31[:, 1], sss, cr, labellabels[0]) plt.scatter(p32[:, 0], p32[:, 1], sss, cg, labellabels[1]) plt.scatter(p33[:, 0], p33[:, 1], sss, cb, labellabels[2]) plt.xlabel(萼片长度) plt.ylabel(萼片宽度) plt.legend() # 子图4 fig.add_subplot(224) plt.title(花瓣长度-花瓣宽度散点图) p41 data4[mask1] p42 data4[mask2] p43 data4[mask3] plt.scatter(p41[:, 0], p41[:, 1], sss, cr, labellabels[0]) plt.scatter(p42[:, 0], p42[:, 1], sss, cg, labellabels[1]) plt.scatter(p43[:, 0], p43[:, 1], sss, cb, labellabels[2]) plt.xlabel(花瓣长度) plt.ylabel(花瓣宽度) plt.legend() plt.subplots_adjust(wspace0.6, hspace0.5) plt.savefig(./萼片、花瓣的长度、宽度对比图.png) plt.show()