zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Matplotlib类别比较图(2)

matplotlib 比较 类别
2023-06-13 09:17:12 时间

1、棉棒图(棒棒糖图)

棉棒图传递了柱状图和条形图相同的信息,只是将矩形换成线条,这样可以减少展示空间,重点放在数据上,看起来更加简洁美观。相对于柱状图,棉棒图更加适合用于数据量较多的情况。

语法:plt.stem([locs], heads, linefmt, markerfmt, basefmt, [bottom], [orientation])

loc:对于垂直棉棒图,对应的是x轴位置,对于水平棉棒图,对应的是y轴位置,默认为heads长度。(可选参数)

heads:每一个棉棒的长度。

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()

2、间断条形图

间断条形图是在条形图基础上绘制的,主要可视化数据在时间维度上的变化情况。

语法: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表示系列颜色等。具体参考:

https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.broken_barh.html?highlight=broken%20barh#matplotlib.axes.Axes.broken_barh

font1 = {
    'family': 'simsun',
    'size': 14
}
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'])
y_label = ax1.get_yticklabels()
#设置y轴标签字体和大小
for label in y_label:
    label.set_fontname('simsun')
    label.set_fontsize(14)

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

3、雷达图

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

语法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
mpl.rcParams["legend.title_fontsize"] = 14 #设置图例标题字体大小为14号
font1 = {
    'family': 'simsun',
    'size': 14
}
fig = plt.figure(figsize = (8, 8))
#构建数据集,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')
#设置图例标题字体为宋体,内容字号为14号
ax4.legend(title = '平均风速', loc = 2, bbox_to_anchor=(1.05, .3), title_fontproperties = 'simsun', fontsize = 14)

示例2:具有填充颜色效果的雷达图。

要求将两个站点的雷达图分别用不同颜色填充。

实现过程:仅仅需要在每个plt.plot语句后加上语句plt.fill()即可。

语法:plt.fill(radius, value, color, alpha)

alpha:颜色的透明度(例如'.3'表示30%的透明度

ax4.plot(angels, values1, marker = 'o', markerfacecolor = '#7fbc41', markersize = 7, color = 'k', linewidth = 1, label = 'site1')
ax4.fill(angels, values1, color = '#7fbc41', alpha = .3) #设置颜色透明度为30%
ax4.plot(angels, values2, marker = 'o', markerfacecolor = '#c51b7d', markersize = 7, color = 'k', linewidth = 1, label = 'site2')
ax4.fill(angels, values2, color = '#c51b7d', alpha = .3)

也可以在雷达图中实现散点图的绘制,语法为:

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

**kwargs:包含了常用的其他设置,例如:marker(标记点样式);s(标记点大小);c(标记点颜色);cmap(标记点颜色映射,以后会说明)

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 #设置每个点的大小

#默认绘制,统一大小,统一颜色,默认标记点样式
ax1 = fig.add_subplot(221, polar = True) #一定要有polar
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()