使用pylab或pyplot绘图的一般过程:
- 生成或读入数据
- 根据实际需要绘制相应的图形
- 设置坐标轴标签、坐标轴刻度、图例、标题等属性
- 显示或保存绘图结果
一、属性设置
- 设置轴标签
- 使用matplotlib.pyplot模块的xlabel()、ylabel()函数
- 轴域的set_xlabel()、set_ylabel()方法
- 坐标轴刻度
- 使用matplotlib.pyplot模块的xticks()、yticks()函数
- 轴域的set_xticks()、set_yticks()方法
- 图例
- 使用matplotlib.pyplot模块的legend()函数
- 标题
- 使用matplotlib.pyplot模块的title()函数
二、折线图
折线图适合描述和比较多组数据随时间变化的趋势,或者一组数据对另外一组数据的依赖程度
matplotlib.pyplot的plot()用于绘制折线图
语法格式:
plot(*args, **kwargs)
参数名称 | 含义 |
---|---|
args | 前两个位置参数用来设置折线图上若干端点的坐标,其中: 第一个参数用来指定折线图上的一个或多个端点的x坐标 第二个参数用来指定折线图上的一个或多个端点的y坐标 第三个位置参数用来指定折线图的颜色、线型和标记符号形状(也可通过kwargs指定),其中: - 颜色可以取值为'r'(红色)、'g'(绿色)、'b'(蓝色)、'c'(青色)、'm'(品红色)、'y'(黄色)、'k'(黑色)、'w'(白色) - 线型常用的取值有'-'(实心线)、'--'(短划线)、'-.'(点划线)、':'(点线) - 标记符号可能的取值有'.'(原点)、'o'(圆圈)、'v'(向下的三角形)、'^'(向上的三角形)、'<'(向左的三角形)、'>'(向右的三角形)、'*'(五角星)、'+'(加号)、'_'(下划线)、'x'(x符号)、'D'(菱形) |
kwargs | 用来设置标签、线宽、反走样以及标记符号的大小、边线颜色、边线宽度与背景色等属性,可选参数有: - alpha: 指定透明度,介于0到1之间,默认为1,表示完全不透明 - antialiased 或 aa: True表示图形启用抗锯齿或反走样,False表示不启用抗锯齿,默认为True - color 或 c : 用来指定线条颜色,可以取值为'r'(红色)、'g'(绿色)、'b'(蓝色)、'c'(青色)、'm'(品红色)、'y'(黄色)、'k'(黑色)、'w'(白色) 或 '#rrggbb'形式的颜色值,例如'#ff0000'表示红色 - label: 用来指定线条标签,设置后会显示在图例中 - linestyle 或 ls : 用来指定线型 - linewidth 或 lw :用来指定线条宽度,单位为像素 - marker :用来指定标记符号的形状 - markeredgecolor 或 mec :用来指定标记符号的边线颜色 - markeredgewidth 或 mew : 用来指定标记符号的边线宽度 - markerfacecolor 或 mfc : 用来指定标记符号的背景颜色 - markersize 或 ms : 用来指定标记符号的大小 - visible : 用来指定线条和标记符号是否可见,默认为True |
例1:
某件商品进价49元,售价75元,现在商场新品上架搞促销活动,顾客每多买一件就给优惠1%,但是每人最多可购买30件。
对于商场而言,活动越火爆商品单价越低,但总收入和盈利越多。
对于顾客来说,虽然买得越多单价越低,但是消费总金额却越来越多的,并且购买太多也会因为用不完而导致过期不得不丢弃造成浪费。
现要求计算并使用折线图可视化购买数量num与商家收益、顾客总消费以及顾客省钱情况的关系,并标记商场收益最大的批发数量和商场收益。
import matplotlib.pyplot as plt # 导入绘图库
purchase_price = 49 # 进价
selling_price = 75 # 售价
# 顾客总消费
def SumConsume(num):
return round(num * selling_price * (1 - 0.01 * num),2)
# 商家利益
def SumProfit(num):
return round(num * selling_price * (1 - 0.01 * num) - num * purchase_price,2)
# 顾客省钱情况
def Saving(num):
return round(num * selling_price * 0.01 * num,2)
# 生成数量列表
nums = list(range(1,31))
# 创建商家收益、顾客总消费以及顾客省钱情况空列表
consumes = []
profits = []
savings = []
# 根据数量生成商家收益、顾客总消费以及顾客省钱情况的列表
for num in nums:
consumes.append(SumConsume(num))
profits.append(SumProfit(num))
savings.append(Saving(num))
# 找到收益最大的批发数量和商场收益
maxprofit = max(profits)
maxnum = nums[profits.index(maxprofit)] # profits.index(maxprofit)获取最大值的索引
# 绘制商家收益折线图
plt.plot(nums,profits,'r-',label = '商家盈利')
# 绘制顾客总消费折线图
plt.plot(nums,consumes,'g-',label = '顾客总消费')
# 绘制顾客省钱情况折线图
plt.plot(nums,savings,'b-',label = '顾客省钱')
plt.rcParams['font.sans-serif']='SimHei' # 用于正常显示中文标签,'SimHei'可换成其他字体
# 添加x轴标签
plt.xlabel('数量')
# 添加y轴标签
plt.ylabel('金额(元)')
# 添加标题
plt.title('数量-金额关系图')
# 添加图例
plt.legend()
# 使用散点标记盈利最大值
plt.scatter([maxnum],[maxprofit],color = 'orange',marker = '*',s = 150) # 绘制图的横纵坐标必须是列表形式,s设置标记大小
# 添加箭头
plt.annotate(s=str(maxprofit) # 标注内容
,xy =(maxnum,maxprofit) # 箭头位置
, xytext = (maxnum-1,maxprofit + 200) # 注释内容位置
,arrowprops = dict(arrowstyle = '<-') # 箭头样式
)
plt.savefig('数量-金额关系图',dpi = 600) # 输出PNG文件 dpi指在一英寸范围内存储像素点的数量
plt.show() # 将图形展示
# 注:须在plt.show()之前保存图片,否则保存的图片为空白
例2
已知学校附近某烧烤店2019年每月的营业额如下图所示。编写程序绘制折线图对该烧烤店全年营业额进行可视化,使用红色下划线连接每月的数据,并在每月的数据处使用三角形标记
月份 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
营业额(万元) | 5.2 | 2.7 | 5.8 | 5.7 | 7.3 | 9.2 | 18.7 | 15.6 | 20.5 | 18 | 7.8 | 6.9 |
import matplotlib.pyplot as plt
# 生成月份
month = list(range(1,13))
# 输入营业额
turnovers = [5.2, 2.7, 5.8, 5.7, 7.3, 9.2, 18.7, 15.6, 20.5, 18, 7.8, 6.9]
# 绘制图形
plt.plot(month, turnovers, 'r-.v')
plt.rcParams['font.sans-serif'] = 'SimHei'
# 设置x标签
plt.xlabel('月份')
# 设置y标签
plt.ylabel('营业额(万元)')
# 设置标题
plt.title('烧烤店2019年营业额变化折线图')
# 紧缩四周空白,扩大绘图区域可用面积
plt.tight_layout()
plt.savefig('烧烤店2019年营业额变化折线图',dpi = 600)
plt.show()
三、散点图
散点图比较适合描述数据在平面或空间中的分布,可以用来帮助分析数据之间关联。
matplotlib.pyplot的scatter()用于绘制散点图
语法格式:
scatter(x, y, s = None, c = None, marker = None, cmap = None, norm = None, vmin = None, vmax = None, alpha = None, linewidths = None, verts = None, edgecolors = None, hold = None, data = None, **kwargs)
参数名称 | 含义 |
---|---|
x、y | 分别用来指定散点的x和y坐标,可以为标量或数组形式的数据,如果x和y都为标量则在指定位置绘制一个散点符号,如果均为数组形式的数据则把两个数组中对应位置上数据作为坐标,在这些位置上绘制若干散点符号 |
s | 指定散点符号的大小 |
marker | 指定散点符号的形状 |
alpha | 指定散点符号的透明度 |
linewidths | 指定线宽,可以是标量或类似于数组的对象 |
edgecolors | 指定散点符号的边线颜色,可以是颜色值或包含若干颜色值的序列 |
例3 |
结合折线图和散点图,重新绘制例2中要求的图形。使用plot()函数依次连接若干端点绘制折线图,使用scatter()函数在指定的端点处绘制散点图,结合这两个函数,实现例2的效果图
import matplotlib.pyplot as plt
month = list(range(1,13))
turnovers = [5.2, 2.7, 5.8, 5.7, 7.3, 9.2, 18.7, 15.6, 20.5, 18, 7.8, 6.9]
# 绘制出折线图
plt.plot(month,turnovers,'r-.')
# 绘制散点图
plt.scatter(month,turnovers,marker = 'v')
# 设置标签
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.xlabel('月份')
plt.ylabel('营业额(万元)')
plt.title('烧烤店2019年营业额变化折线图')
plt.tight_layout()
plt.savefig('烧烤店2019年营业额变化折线图',dpi = 600)
plt.show()
例4
某商场开业三个月之后,有顾客反应商场一楼部分位置的手机信号不好,个别收银台有时无法正常使用微信支付或支付宝,商场内也有些位置无法正常使用微信。为此,商场安排工作人员在不同的位置对手机信号强度进行测试以便进一步提高服务质量和用户体验,文件中每行使用逗号分隔的3个数字分别表示商场内一个位置的x、y坐标和信号强度,其中x、y坐标值以商场西南角为坐标原点且向东为x轴正轴(共150米)、向北为y正轴(共30米),信号强度以0为表示无信号、100表示最强。
要求:编写程序,使用散点图对该商场一楼所有位置的手机信号强度进行可视化,既可以直观地发现不同位置信号地强度以便分析原因,也方便观察测试位置的分布是否合理。在散点图中,使用横轴表示x坐标位置、纵轴表示y坐标位置,使用五角星标记测试位置,五角星大小表示信号的强弱,五角星越大表示信号越强,反之表示信号越弱。同时为了获得更好的可视化效果,信号强度高于或等于70的位置使用绿色五角星,低于70且高于或等于40的使用蓝色五角星,低于40的位置使用红色五角星。
import pandas as pd
import matplotlib.pyplot as plt
# 读取文件
f = open('商场信号测试.csv')
data = pd.read_csv(f,header=None)
# 通过遍历,根据信号的强弱设置散点的大小和颜色
for index,row in data.iterrows():
if row[2]< 40:
color = 'r'
elif row[2] <70:
color = 'b'
else:
color = 'g'
plt.scatter(row[0],row[1],marker = '*',color = color,s = row[2]) # 第三列决定大小
# 添加标签
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.xlabel('正东方向距离(米)')
plt.ylabel('正北方向距离(米)')
plt.title('某商场手机信号强弱分布图')
plt.savefig('手机信号强弱分布图',dpi=600)
plt.show()
四、柱状图
柱状图适合用于比较多组数据之间的大小,或者类似的场合,但对大规模数据的可视化不是很合适
matplotlib.pyplot的bar()用于绘制柱状图
语法格式:
bar(left, height, width = 0.8, bottom = None, hold = None, data = None, **kwargs)
参数名称 | 含义 |
---|---|
left | 指定每个柱的左侧边框的x坐标 |
height | 指定每个柱的高度 |
width | 指定每个柱的宽度,默认为0.8 |
bottom | 指定每个柱底部边框的y坐标 |
color | 指定每个柱的颜色 |
edgecolor | 指定每个柱的边框颜色 |
linewidth | 指定每个柱的边框线宽 |
align | 指定每个柱的对齐方式,以垂直柱状图为例,如果align = 'edge'且width > 0表示柱的左侧边框与给定的x坐标对齐,如果align = 'edge'且width < 0表示柱的右侧边框与给定的x坐标对齐,如果align = 'center'表示给定的x坐标恰好位于柱的中间位置 |
orientation | 指定柱的朝向,设置为'vertical'时绘制垂直柱状图,设置为'horizontal'时绘制水平柱状图 |
alpha | 指定透明度 |
antialiased 或 aa | 设置是否使用抗锯齿功能 |
edgecolor 或 ec | 设置柱的边框颜色 |
fill | 设置是否填充 |
hatch | 指定内部填充符号,可选值有'/'、'\\'、'|'、'-'、'+'、'x'、'o'、'O'、'.'、'*' |
label | 指定图例中显示的文本标签 |
linestyle 或 ls | 指定边框的线型 |
linewidth 或 lw | 指定边框的线宽 |
visible | 设置绘制的柱是否可见 |
例5
某商场几个部门2019年每个月的业绩如下表所示。编写程序绘制柱状图可视化各部门的业绩,可以借助于pandas的DataFrame结构快速绘制图形,并要求坐标轴、标题和图例能够显示中文
某商场各部门业绩(万元)
月份 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
男装 | 51 | 32 | 58 | 57 | 30 | 46 | 38 | 38 | 40 | 53 | 58 | 50 |
女装 | 70 | 30 | 48 | 73 | 82 | 80 | 43 | 25 | 30 | 49 | 79 | 60 |
餐饮 | 60 | 40 | 46 | 50 | 57 | 76 | 70 | 33 | 70 | 61 | 49 | 45 |
化妆品 | 110 | 75 | 130 | 80 | 83 | 95 | 87 | 89 | 96 | 88 | 86 | 89 |
金银首饰 | 143 | 100 | 89 | 90 | 78 | 129 | 100 | 97 | 108 | 152 | 96 | 87 |
import pandas as pd
import matplotlib.pyplot as plt
data = pd.DataFrame({'月份':[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
,'男装':[51, 32, 58, 57, 30, 46, 38, 38, 40, 53, 58, 50]
,'女装':[70, 30, 48, 73, 82, 80, 43, 25, 30, 49, 79, 60]
,'餐饮':[60, 40, 46, 50, 57, 76, 70, 33, 70, 61, 49, 45]
,'化妆品':[110, 75, 130, 80, 83, 95, 87, 89, 96, 88, 86, 89]
,'金银首饰':[143, 100, 89, 90, 78, 129, 100, 97, 108, 152, 96, 87]})
plt.rcParams['font.sans-serif'] = 'SimHei'
data.plot(x='月份', kind = 'bar')
plt.xlabel('月份')
plt.ylabel('营业额(万元)')
plt.title('2019年各部门每月营业额条形图')
plt.legend()
plt.savefig('2019年各部门每月营业额条形图', dpi = 600)
plt.show()
例6
根据例2中烧烤店的数据绘制柱状图,要求可以设置每个柱的颜色,内部填充符号、描边效果和标注文本
import matplotlib.pyplot as plt
# 生成月份
month = list(range(1,13))
# 输入营业额
turnovers = [5.2, 2.7, 5.8, 5.7, 7.3, 9.2, 18.7, 15.6, 20.5, 18, 7.8, 6.9]
for x,y in zip(month,turnovers):
color = '#%06x'%int(y*10000)
# 将每月营业额的10000倍转换成16进制的六位数,不够位数的使用0补充
plt.bar(x, y, color = color, hatch ='*',width = 0.8, edgecolor = 'k',linestyle = '-', linewidth = 1.5)
plt.text(x-0.3,y+0.4,'%.1f'%y)
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.title('2019年烧烤店营业额柱形图')
plt.xlabel('月份')
plt.ylabel('营业额(万元)')
plt.xticks(month) # 设置x轴的刻度
plt.ylim(0,22) # 设置y轴坐标轴范围
plt.savefig('2019年烧烤店营业额柱形图', dpi = 500)
plt.show()
例7
“集体过马路”是网友对集体闯红灯现象的一种调侃,即“凑够一撮人就可以走了,与红绿灯无关”。出现这种现象的原因之一是很多人认为法不责众,从而不顾交通法规和安全,但这种危险的过马路方式造成了很多不同程度的交通事故和人员伤亡。某城市在多个路口对行人过马路的方式进行了随机调查。在所有参与调查的市民中,“从不闯红灯” “跟别人闯红灯” “带头闯红灯”的人数如表所示,针对这组调查数据,编写程序绘制柱状图进行展示和对比。
性别 | 从不闯红灯 | 跟从别人闯红灯 | 带头闯红灯 |
---|---|---|---|
男性 | 450 | 800 | 200 |
女性 | 150 | 100 | 300 |
import matplotlib.pyplot as plt
import pandas as pd
data = pd.DataFrame({'男性':[450, 800, 200], '女性':[150, 100, 300]})
data.plot(kind = 'bar')
plt.rcParams['font.sans-serif'] = 'SimHei' # 默认所有中文字体为黑体
# 设置x轴刻度和文本,fontproperties参数可以指定中文的字体
plt.xticks([0,1,2],['从不闯红灯', '跟别人闯红灯', '带头闯红灯'],fontproperties = 'Lisu', rotation = 0)
# 只在有数据的位置显示刻度
plt.yticks(list(data['男性'].values)+list(data['女性'].values))
plt.title('过马路方式')
plt.ylabel('人数')
plt.savefig('过马路方式',dpi = 600)
plt.show()
五、饼状图
饼状图适合展示一个总体中各类别数据所占的比例
matplotlib.pyplot的pie()用于绘制饼状图
语法格式:
pie(x, explode = None, labels = None, colors = None, autopct = None, pctdistance = 0.6, shadow = False, labeldistance = 1.1, startangle = None, radius = None, counterclock = True, wedgeprops = None, textprops =None, center = (0,0), frame = False, hold = None, data = None)
常用参数
参数名称 | 含义 |
---|---|
x | 数组形式的数据,自动计算其中每个数据的占比并确定对应的扇形面积 |
explode | 取值可以为None或与x等长的数组,用来指定每个扇形沿半径方向相对于圆心的偏移量,None表示不进行偏移,正数表示远离圆心 |
colors | 可以为None或包含颜色的序列,用来指定每个扇形的颜色,如果颜色数量少于扇形数量,就循环使用这些颜色 |
labels | 与x等长的字符串序列,用来指定每个扇形的文本标签 |
autopct | 用来设置在扇形内部使用数字值作为标签显示时的格式 |
pctdistance | 用来设置每个扇形的中心与autopct指定文本间的距离,默认为0.6 |
labeldistance | 每个饼标签绘制时径向距离 |
shadow | True/False,用来设置是否显示阴影 |
startangle | 设置饼状图第一个扇形的起始角度,相当于x轴并沿逆时针方向计算 |
radius | 用来设置饼的半径,默认为1 |
counterclock | True/False,用来设置饼状图中每个扇形的绘制方向 |
center | (x,y)形式的元组,用来设置饼的圆心位置 |
frame | True/False,用来显示是否显示边框 |
例8
已知某班级的数据结构、线性代数、英语和Python课程考试成绩,要求绘制饼状图显示每门课的成绩中优(85分以上)、及格(60~85分)、不及格(60分以下)的占比。
'数据结构':[89, 70, 49, 87, 92, 84, 73, 71, 78, 81, 90, 37, 77, 82, 81, 79, 80, 82, 75, 90, 54, 80, 70, 68, 61]
'线性代数':[70, 74, 80, 60, 50, 87, 68, 77, 95, 80, 79, 74, 69 , 64, 82, 81, 78, 90, 78, 79, 72, 69, 45, 70, 70
'英语':[83, 87, 69, 55, 80, 89, 96, 81, 83, 90, 54, 70, 79, 66, 85, 82, 88, 76, 60, 80, 75, 83, 75, 70, 20]
'Python':[90, 60, 82, 79, 88, 92, 85, 87, 89, 71, 45, 50, 80 , 81, 87, 93, 80, 70, 68, 65, 85, 89, 80, 72, 75]
import matplotlib.pyplot as plt
from itertools import groupby
scores = pd.DataFrame({'数据结构':[89, 70, 49, 87, 92, 84, 73, 71, 78, 81, 90, 37, 77
, 82, 81, 79, 80, 82, 75, 90, 54, 80, 70, 68, 61]
,'线性代数':[70, 74, 80, 60, 50, 87, 68, 77, 95, 80, 79, 74, 69
, 64, 82, 81, 78, 90, 78, 79, 72, 69, 45, 70, 70]
,'英语':[83, 87, 69, 55, 80, 89, 96, 81, 83, 90, 54, 70, 79, 66
, 85, 82, 88, 76, 60, 80, 75, 83, 75, 70, 20]
,'Python':[90, 60, 82, 79, 88, 92, 85, 87, 89, 71, 45, 50, 80
, 81, 87, 93, 80, 70, 68, 65, 85, 89, 80, 72, 75]})
def classify(score):
if score >= 85:
return '优'
elif score >= 60:
return '及格'
else:
return '不及格'
plt.rcParams['font.sans-serif'] = 'SimHei'
groups = dict()
# 多字段分组
for subject,score in scores.items():
groups[subject] = dict()
# 排序后分组
sorted(score)
for category,group in groupby(sorted(score),classify):
groups[subject][category] = len(list(group))
for i,data in enumerate(groups.items()):
plt.subplot(2,2,i+1)
plt.pie(list(data[1].values()),labels = list(data[1].keys()),autopct = '%1.1f%%')
plt.axis('equal') # 圆的饼图
plt.xlabel(data[0])
plt.savefig('各科成绩占比',dpi = 600)
plt.show()
六、雷达图
常用于企业经营状况的分析,可以更加直观地表达企业经营状况全貌,便于企业管理者及时发现薄弱环节进行改进
matplotlib.pyplot的polar()用于绘制雷达图
语法格式:
pie(*args,**kwargs)
注:args和kwargs含义与plot()函数相似
例9
很多学校的毕业证和学位证只能体现一种学习经历或者证明达到该学习阶段的最低要求,并不能体现学生的综合能力以及擅长的学科与领域,所以大部分单位在招聘时往往还需要借助于成绩单进行综合考察。但单独的表格式成绩单不是很直观,并且存在造假的可能。在证书上列出学生所有课程的成绩不太现实,但是可以考虑把每个学生的专业核心课成绩绘制成雷达图印在学位证书上,这样既可以让用人单位非常直观地了解学生综合能力,也比单独打印的成绩单要权威和正式很多。编写程序,根据某学生的部分专业核心课程和成绩清单绘制雷达图。
课程 | 分数 |
---|---|
C++ | 80 |
Python | 95 |
高数 | 78 |
大学英语 | 85 |
软件工程 | 45 |
组成原理 | 65 |
数字图像处理 | 80 |
计算机图形学 | 60 |
import matplotlib.pyplot as plt
import numpy as np
subject = ['C++','Python','高数','大学英语','软件工程 ','组成原理','数字图像处理','计算机图形学']
scores = [80, 95, 78, 85, 45, 65, 80, 60]
# 根据数据长度将圆心角等分
datalength = len(scores)
angles = np.linspace(0,2*np.pi,datalength,endpoint = False)
# 使图闭合
scores.append(scores[0])
angles = np.append(angles,angles[0])
# 绘制雷达图
plt.polar(angles,scores,'r>--',linewidth = 2) # 表示角度的参数放在第一位
# 设置角度标签
plt.thetagrids(angles*180/np.pi,subject,fontproperties = 'Simhei')
# 填充雷达图内部结构
plt.fill(angles,scores,facecolor = 'r',alpha = 0.5)
plt.xlabel('成绩分布雷达图',fontproperties = 'Simhei',size = 20)
plt.savefig('成绩分布雷达图', dpi =600)
plt.show()
例10
为了分析家庭开销的详细情况,也为了更好地进行家庭理财,张三对2018年全年每个月的蔬菜、水果、肉类、日用品、旅游、随礼等各项支出做了详细记录,如表所示。编写程序,根据张三的家庭开销情况绘制雷达图。
月份 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
蔬菜 | 1350 | 1500 | 1330 | 1550 | 900 | 1400 | 980 | 1100 | 1370 | 1250 | 1000 | 1100 |
水果 | 400 | 600 | 580 | 620 | 700 | 650 | 860 | 900 | 880 | 900 | 600 | 600 |
肉类 | 480 | 700 | 370 | 440 | 500 | 400 | 360 | 380 | 480 | 600 | 600 | 400 |
日用 | 1100 | 1400 | 1040 | 1300 | 1200 | 1300 | 1000 | 1200 | 950 | 1000 | 900 | 950 |
衣服 | 650 | 3500 | 0 | 300 | 300 | 3000 | 1400 | 500 | 800 | 2000 | 0 | 0 |
旅游 | 4000 | 1800 | 0 | 0 | 0 | 0 | 0 | 4000 | 0 | 0 | 0 | 0 |
随礼 | 0 | 4000 | 0 | 600 | 0 | 1000 | 600 | 1800 | 800 | 0 | 0 | 1000 |
import matplotlib.pyplot as plt
import numpy as np
import random
data = {
'蔬菜': [1350,1500,1330,1550,900,1400,980,1100,1370,1250,1000,1100],
'水果': [400,600,580,620,700,650,860,900,880,900,600,600],
'肉类': [480,700,370,440,500,400,360,380,480,600,600,400],
'日用': [1100,1400,1040,1300,1200,1300,1000,1200,950,1000,900,950],
'衣服': [650,3500,0,300,300,3000,1400,500,800,2000,0,0],
'旅游': [4000,1800,0,0,0,0,0,4000,0,0,0,0],
'随礼': [0,4000,0,600,0,1000,600,1800,800,0,0,1000]
}
# 将圆心角等分
angles = np.linspace(0,2 * np.pi,12,endpoint = False)
# 闭合
angles = np.append(angles,angles[0])
markers='*^>voD'
for key,value in data.items():
data[key].append(data[key][0])
# 产生随机色
color = '#'+''.join(map('{0:02x}'.format,np.random.randint(0,255,3)))
plt.polar(angles,data[key],color = color,marker = random.choice(markers),label = key)
plt.rcParams['font.sans-serif'] = 'SimHei'
# 设置角度的网格标签
plt.thetagrids(angles*180/np.pi,list(map(lambda i: '%d月'%i,range(1,13))),fontproperties = 'Simhei')
plt.legend()
plt.savefig('家庭开销情况绘制雷达图',dpi = 600)
plt.show()
七、绘图区域切分实战
用于将整个绘图区域切分成多个子区域,在不同的子区域中绘制不同的图形
matplotlib.pyplot的subplot()函数用于切分绘图区域和创建子图
语法格式:
subplot(*args,**kwargs)
重要参数
参数名称 | 含义 |
---|---|
args | 用于设置表示切分的行数、列数以及当前选择子图的编号的位置 |
kwargs | 用来设置图形更多属性的关键参数,常用的有: - facecolor:用来设置当前子图的背景颜色 - polar:用来设置当前子图是否为极坐标图,默认为False - projection:用于设置当前子图的投影方式,可用值有'aitoff','hammer',''lambert','mollweide','polar','rectilinear'(默认值)或其他已注册的自定义投影方式 - sharex、sharey: 用来指定与哪个子图共享x或y坐标,设置之后,当前子图与sharex或sharey指定的子图具有同样的起止范围、刻度和缩放比例 |
八、设置图例样式
用于对所绘制的图形中使用的各种符号和颜色进行说明,对于理解图形有重要的作用
matplotlib.pyplot的legend()函数用于设置图例
语法格式:
legend(*args,**kwargs)
重要参数
参数名称 | 含义 |
---|---|
loc | 说明图例的位置,可以为整数、字符串或实数元组。可用字符串值有'best'、'upper right'、'upper left'、'lower left'、'low right'、'right'、'center left'、'center right'、'lower center'、'upper center'、'center',这些字符串依次等价于0~10之间的整数 |
bbox_to_anchor | 指定图例在bbox_transform坐标系中的位置,通常为包含两个实数的元组,常与loc参数的字符串组合使用。 |
ncol | 表示图例分几栏显示的整数。默认为1 |
prop | 用来指定图例中文本使用的字体 |
fontsize | 用来指定图例中文本使用的字号,可以是表示绝对大小的整数、实数或表示相对大小的字符串'xx-small'、'x-small'、'small'、'medium'、'large'、'x-large'、'xx-large' |
numpoints | 用来指定折线图的图例中显示几个标记符号的整数 |
scatterpoints | 用来指定散点图的图例中显示几个标记符号的整数 |
markerscale | 用来指定图例中的标点符号与原始标记符号大小的相对比例 |
markerfirst | 用来指定是否图例符号在图例文本前面的布尔值。设置为True时表示图例符号在前,False表示图例文本在前 |
fancybox | 用来指定图例是否使用圆角矩形边缘的布尔值 |
shadow | 用来指定图例是否显示阴影的布尔值 |
framealpha | 用来指定图例背景透明度的实数 |
facecolor | 用来指定图例的背景颜色 |
edgecolor | 用来指定图例的边框颜色 |
mode | 如果设置为'expand',则图例在水平方向上会进行扩展至与子图宽度相同 |
title | 用来指定图例标题的字符串 |
borderpad | 用来指定图例边框内空白区域大小的实数 |
labelspacing | 用来指定图例中每个条目之间垂直距离的实数 |
columnspacing | 用来指定图例的多栏之间的横向距离的实数 |
九、填充图形
- matplotlib.pyplot的fill()函数用于绘制填充的多边形
参数含义与plot()函数相同
- matplotlib.pyplot的fill_between()函数用于填充两条曲线之间的多边形区域
语法格式:
fill_between(x,y1,y2=0,where = None,interpolate = False, step = None, hold = None, data = None, **kwargs)
ps:参数具体含义在导入模块之后,使用help(plt.fill_between)
十、保存绘图结果
matplotlib.pyplot的savefig()函数用于把当前绘制的图片保存为图片文件
语法格式:
savefig(fname,dpi =None, facecolor = 'w', edgecolor= 'w', orirntation = 'portrait',papertype = None, format = None, transparent = False, bbox_inches = None, pad_inches = 0.1, frame = None)
重要参数
参数名称 | 含义 |
---|---|
fname | 要保存的文件名 |
dpi | 图形的分辨率 |
facecolor、edgecolor | 设置图形的背景色和边框颜色,默认均为白色 |
format | 用来指定保存文件的类型和扩展名,可以设置为'.png'、'.pdf'、'.ps'、'.eps'、'.svg'以及'.jpeg'、'.jpg'、'.tif'、'.tiff'等其他后端所支持的类型。如果不指定该参数,则根据参数fname字符串指定的文件扩展名来确定类型 |
transparent | 如果设置为True则子图透明,如果此时没有设置facecolor 和 edgecolor则整个图形也透明 |
bbox_inches | 用来指定保存图形的哪一部分,如果设置为'tight'则使用能够包围图形的最小边框 |
pad_inches | 用来设置当bbox_inches = 'tight'时图形的内边距 |
bbox_extra_artists | 用来指定当bbox_inches = 'tight'时应考虑保存的额外图形元素 |