Matplotlib类别比较图(1)——棉棒图、间断条形图、雷达图绘制

380 阅读6分钟

本账号致力于python数据分析和可视化,会不定期发布技术内容。如果觉得本文文章有用,可以动动小手,点个关注,原创文章将会第一时间推送,如有建议,可私信或评论区留言。本内容在点击上方 " python数据可视化之美"公众号同步更新。

1 导读

上一节介绍了类别比较图的概念与特征,本节介绍棒棒糖图间断条形图雷达图的绘制方法。

2 棒棒糖图

棉棒图传递了柱状图和条形图相同的信息,只是将矩形换成线条,这样可以减少展示空间,重点放在数据上,看起来更加简洁美观。相对于柱状图,棉棒图更加适合用于数据量较多的情况。
语法:plt.stem(x, y, linefmt, markerfmt, basefmt, [bottom], [orientation])
x, y:意义就不用明说了吧,拒绝介绍😜
linefmt:棉棒的样式,具体样式见下表。(可选参数)

linefmt效果
'-'实线
'--'虚线
'-.'虚线-点线
':'点线

注:前面加颜色简写可以为其指定颜色。例如:'g--'表示绿色的虚线,'r-.'表示红色的虚线-点线。同样的规则适用于末端样式。
markerfmt:棉棒末端样式,默认圆形。'd'表示菱形,'*'表示星形,'rd'表示红色的菱形,'r'表示红色的圆形(因为默认是圆形,加上了红色)。(可选参数)
basefmt:基线的样式,规则和颜色同linefmt。(可选参数)
bottom:基线位置,默认为0。(可选参数)
orientation:棉棒图方向,默认垂直x轴。(可选参数)

以下是一个实例,用不同的样式和颜色绘制棉棒图

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-2, 5, 30)
y = np.sin(x)
fig = plt.figure(figsize = (8, 8))
#默认样式
ax1 = fig.add_subplot(221)
ax1.stem(x, y)

#设置棉棒线形为蓝色虚线,标记点为菱形
ax2 = fig.add_subplot(222)
ax2.stem(x, y, linefmt = 'b--', markerfmt = 'd')

#设置棉棒线形为蓝色虚线-点线,标记点为菱形,基线线型为红色虚线
ax3 = fig.add_subplot(223)
ax3.stem(x, y, linefmt = 'b-.', markerfmt = 'bo', basefmt = 'r--')

#设置棉棒线形为蓝色虚线,标记点为菱形基线,基线线型为红色且起始点为0.01
ax4 = fig.add_subplot(224)
ax4.stem(x, y, linefmt = 'b:', markerfmt = 'b*', basefmt = 'b-', bottom = 0.01)
plt.show()

1.png

3 间断条形图

间断条形图是在条形图基础上绘制的,主要可视化数据在时间维度上的变化情况。例如某个机械设备的故障情况、电影院的时间安排等等都可以用此实现。

语法:plt.broken_barh(xranges, yrange, **kwargs)

xranges:表示某个系列的持续时间,例如[(60, 90), (190, 20), (250, 15)]表示有三段。第一段起点为x=60,持续时间90单位;第二段起点为x=190,持续时间20单位,以此类推。
yrange:表示条形图矩形的宽度(占据y轴的位置),例如(10, 8)表示该系列从y=10开始,占据宽度为8。
**kwargs:其他参数设置,例如facecolors表示系列颜色等。

fig = plt.figure()
#设置每个系列的持续时间和颜色
broken1 = [(30, 50), (120, 10), (160, 70)]
color1 = '#af5000'

broken2 = [(10, 50), (100, 20), (150, 50)]
color2 = ('#7fc9f7', '#fdc086', '#fdc000')

ax1 = fig.add_subplot(111)
ax1.broken_barh(broken1, (10, 8), facecolors = color1)
ax1.broken_barh(broken2, (20, 8), facecolors = color2)

ax1.set_yticks([14, 24], ['装置1', '装置2'])

ax1.set_xlabel('故障持续情况', font1)
plt.show()

2.png

4 雷达图

又被称为蜘蛛图、极地图或星图。雷达图是用来比较多个定量变量的方法,可以用于查看哪些变量具有相似的数值,或者每个变量中有没有异常值。此外,雷达图也可以查看数据集中哪些变量得分较高/低,是显示性能表现的理想之选。

4.1 实现方法1

语法:plt.plot(radius, value, **kwargs)
radius:某个变量所在的角度。
value:变量值。
**kwargs:其他设置,例如:marker(点标记样式);markerfacecolor(点标记颜色);markersize(点标记大小);color(线颜色);linewidth(线宽度);label(系列标签)

现在构造一个数据集,包括两个站点的1-12月的月平均风速,实现用雷达图表示。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import matplotlib as mpl

fig = plt.figure(figsize = (88))
#构建数据集,2个站点的1-12月平均风速
dict1 = dict(month = [i for i in range(1, 13, 1)],
            site1_ws = [4.5, 3.6, 2.1, 1.3, 2.7, 6.3, 5.5, 5.9, 4.6, 2.6, 2.1, 1.7],          
            site2_ws = [2.1, 1.7, 2.3, 2.5, 3.1, 4.3, 4.7, 6.5, 5.8, 4.6, 3.2, 2.8]) 

df = pd.DataFrame(dict1)
N = df.shape[0] #获取月份的个数

angels = [n/float(N)*2*np.pi for n in range(N)] #设置每个月份角度值,共分为12月
angels += angels[:1] #关键语句,如果不添加此语句,最后12月和1月不能相连

values1 = list(df.site1_ws)
values2 = list(df.site2_ws)
values1 += values1[:1] #关键语句,同angel效果一样
values2 += values2[:1]

#默认样式
ax1 = fig.add_subplot(221, polar = True)
ax1.plot(angels, values1, label = 'site1')
ax1.plot(angels, values2, label = 'site2')


#极坐标旋转90度,定义方向为顺时针,设置y值位置
ax2 = fig.add_subplot(222, polar = True)
ax2.set_theta_offset(np.pi/2) #设置极坐标旋转角度,旋转90,默认逆时针旋转
ax2.set_theta_direction(-1) #设置极坐标方向,定义顺时针从小到大ax2.set_rlabel_position(0) #设置极坐标y值位置
ax2.plot(angels, values1, label = 'site1')
ax2.plot(angels, values2, label = 'site2')

#设置x轴标签
ax3 = fig.add_subplot(223, polar = True)
ax3.set_theta_offset(np.pi/2) 
ax3.set_theta_direction(-1) ax3.set_rlabel_position(0) 
ax3.set_xticks(angels[:-1], df.month)#设置x轴标签,改为1-12月
ax3.plot(angels, values1, label = 'site1')
ax3.plot(angels, values2, label = 'site2')


#设置标记点线型,颜色,大小等,以及图例标题字体,字号
ax4 = fig.add_subplot(224, polar = True)
ax4.set_theta_offset(np.pi/2) 
ax4.set_theta_direction(-1) 
ax4.set_rlabel_position(0) 
ax4.set_xticks(angels[:-1], df.month)
ax4.set_xlabel('月份', font1)

#设置标记点颜色,大小,形状,线型,线宽的设置
ax4.plot(angels, values1, marker = 'o', markerfacecolor = '#7fbc41', markersize = 7, color = 'k', linewidth = 1, label = 'site1')
ax4.plot(angels, values2, marker = 'o', markerfacecolor = '#c51b7d', markersize = 7, color = 'k', linewidth = 1, label = 'site2')

ax4.legend(title = '平均风速', loc = 2, bbox_to_anchor=(1.05, .3), title_fontproperties = 'simsun', fontsize = 14)

3.png

4.2 实现方法2

语法:plt.scatter(radius, value, **kwargs)

fig = plt.figure(figsize = (7, 7))

radii = 20*np.random.rand(50#设置随机50个0-20的y值
theta = 2*np.pi*np.random.rand(50#为每个点指定一个角度,即x值
colors = np.random.rand(50#随机生成50个0-1的数值

size = 20*radii #设置每个点的大小
#默认绘制,统一大小,统一颜色,默认标记点样式,一定要有polar
ax1 = fig.add_subplot(221, polar = True) 
ax1.scatter(theta, radii)

#设置标记点样式为星型,默认大小,默认颜色
ax2 = fig.add_subplot(222, polar = True)
ax2.scatter(theta, radii, marker = '*')

#改变标记点样式,改变标记点大小,默认颜色
ax3 = fig.add_subplot(223, polar = True)
ax3.scatter(theta, radii, marker = '*', s = size)

#改变标记点样式,改变大小,改变颜色,并将颜色映射到色条上
ax4 = fig.add_subplot(224, polar = True)
ax4.scatter(theta, radii, marker = '*', s = size, c = colors, cmap = mpl.cm.jet)
plt.show()

5.png

5 总结

本文总结了类别比较图中棉棒图、间断条形图、雷达图的绘制语法,并利用实例进行了总结。并回顾了matplotlib中均匀绘图的语法,只有不断重复所学知识,才能快速理解、学习。

由于篇幅的限制,本篇到此结束,下一节将继续介绍matplotlib类别比较图的其他绘图语法。此内容将在"python数据可视化之美"公众号同步更新。如果您有更好的想法或对文章有其他建议,可以关注或评论留言。如果有想要了解其它的内容,也可以联系或评论,感谢您的阅读。

创作不易,动动可爱的小手点个赞呗😜😜😜