简单图表的绘制
1.1 绘制折线图
使用pyplot的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类对象(代表线条)的列表。
第一种
plt.plot(x1, y1)
plt.plot(x2, y2)
第二种
plt.plot(x1, y1, x2, y2)
第三种
arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12]])
plt.plot(arr[0], arr[1:])
绘制折线图
import matplotlib.pyplot as plt #导入matplotlib包下的pyplot并命名为plt函数
import numpy as np
#使用matplotlib绘制第一个图表
data =np.array([1,2,3,4,5]) #准备数据
fig=plt.figure() #创建画布
ax=fig.add_subplot(111) #添加绘图区域
ax.plot(data) #绘制图标
plt.show() #展示图标
1.2绘制柱形图或堆积柱形图
bar()函数会返回一个BarContainer类的对象。
•BarContainer类的对象是一个包含柱形或误差棒的容器,它亦可以视为一个元组,可以遍历获取每个柱形或误差棒。
•BarContainer类的对象也可以访问patches或errorbar属性分别获取图表中所有的柱形或误差棒。
•绘制有一组柱形的柱形图
import matplotlib.pyplot as plt
import numpy as np
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()
•绘制有两组柱形的柱形图
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(5)
y1 = np.array([10, 8, 7, 11, 13])
y2 = np.array([9, 6, 5, 10, 12])
# 柱形的宽度
bar_width = 0.3
# 根据多组数据绘制柱形图
plt.bar(x, y1, tick_label=['a', 'b', 'c', 'd', 'e'], width=bar_width)
plt.bar(x+bar_width, y2, width=bar_width)
plt.show()
•绘制堆积柱形图
在使用bar()函数绘制图表时,可以通过给该函数的bottom参数传值的方式控制柱形的y值,使后绘制的柱形位于先绘制的柱形的上方。
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(5)
y1 = np.array([10, 8, 7, 11, 13])
y2 = np.array([9, 6, 5, 10, 12])
# 柱形的宽度
bar_width = 0.3
# 绘制堆积柱形图
plt.bar(x, y1, tick_label=['a', 'b', 'c', 'd', 'e'], width=bar_width)
plt.bar(x, y2, bottom=y1,width=bar_width)
plt.show()
•绘制有误差棒的柱形图
在使用bar()函数绘制图表时,还可以通过给xerr、yerr参数传值的方式为柱形添加误差棒。
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(5)
y1 = np.array([10, 8, 7, 11, 13])
y2 = np.array([9, 6, 5, 10, 12])
# 柱形的宽度
bar_width = 0.3
# 偏差数据
error = [2, 1, 2.5, 2, 1.5]
# 绘制带有误差棒的柱形图
plt.bar(x, y1, tick_label=['a', 'b', 'c', 'd', 'e'], width=bar_width)
plt.bar(x, y1, bottom=y1, width=bar_width, yerr=error)
plt.show()
1.3绘制条形图或堆积条形图
使用pyplot的barh()函数可以快速地绘制条形图或堆积条形图 。
barh(y, width, height=0.8, left=None, align='center', *, **kwargs)
y:表示条形的y值。
width:表示条形的宽度。
height:表示条形的高度,默认值为0.8。
left:条形左侧的x坐标值,默认值为0。
align:表示条形的对齐方式,默认值为“center”,即条形与刻度线居中对齐。
tick_label:表示条形对应的刻度标签。
xerr,yerr:若未设为None,则需要为条形图添加水平/垂直误差棒。
barh()函数会返回一个BarContainer类的对象。
•绘制有一组条形的条形图
import matplotlib.pyplot as plt
import numpy as np
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()
•绘制有两组条形的条形图
import matplotlib.pyplot as plt
import numpy as np
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值,使后绘制的条形位于先绘制的条形右方。
import matplotlib.pyplot as plt
import numpy as np
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, x2, left=x1, height=bar_height)
plt.show()
•绘制有误差棒的条形图
在使用barh()函数绘制图表时,可以通过给xerr、yerr参数传值的方式为条形添加误差棒。
import matplotlib.pyplot as plt
import numpy as np
y = np.arange(5)
x1 = np.array([10, 8, 7, 11, 13])
x2 = np.array([9, 6, 5, 10, 12])
bar_height = 0.3
# 偏差数据
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, x2, left=x1, height=bar_height, xerr=error)
plt.show()
1.4绘制堆积面积图
使用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 matplotlib.pyplot as plt
import numpy as np
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()
1.5绘制直方图
使用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’代表填充的线条直方图。
align:表示矩形条边界的对齐方式,可设置为’left’、‘mid’或’right’,默认为’mid’。
orientation:表示矩形条的摆放方式,默认为’vertical’,即垂直方向。
rwidth:表示矩形条宽度的百分比,默认为0。若histtype的值为’step’或’stepfilled’,则直接忽略rwidth参数的值。
stacked:表示是否将多个矩形条以堆叠形式摆放。
•绘制填充的线条直方图
import matplotlib.pyplot as plt
import numpy as np
# 准备50个随机测试数据
scores = np.random.randint(0,100,50)
# 绘制直方图
plt.hist(scores, bins=8, histtype='stepfilled')
plt.show()
人脸识别的灰度直方图
本实例要求使用一组10000个随机数作为人脸图像的灰度值,使用hist()函数绘制下图所示的灰度直方图。
import matplotlib.pyplot as plt
import numpy as np
# 10000个随机数
random_state = np.random.RandomState(19680801)
radom_x = random_state.randn(10000)
# 绘制包含25个矩形条的直方图
plt.hist(radom_x, bins=25)
plt.show()
1.6绘制饼图或圆环图
使用pyplot的pie()函数可以快速地绘制饼图或圆环图 。
pie(x, explode=None, labels=None, autopct=None, pctdistance=0.6,
startangle=None, *, data=None)
x:表示扇形或楔形的数据。
explode:表示扇形或楔形离开圆心的距离。
labels:表示扇形或楔形对应的标签文本。
autopct:表示控制扇形或楔形的数值显示的字符串,可通过格式字符串指定小数点后的位数。
pctdistance:表示扇形或楔形对应的数值标签距离圆心的比例,默认为0.6。
shadow:表示是否显示阴影。
labeldistance:表示标签文本的绘制位置(相对于半径的比例),默认为1.1。
startangle:表示起始绘制角度,默认从x轴的正方向逆时针绘制。
radius:表示扇形或楔形围成的圆形半径。
wedgeprops:表示控制扇形或楔形属性的字典。例如,通过wedgeprops = {‘width’: 0.7} 将楔形的宽度设为0.7。
textprops:表示控制图表中文本属性的字典。
center:表示图表的中心点位置,默认为(0,0)。
frame:表示是否显示图框。
•绘制饼图
import matplotlib.pyplot as plt
import numpy as np
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()
•绘制圆环图
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)
1.7 绘制散点图或气泡图
使用pyplot的scatter()函数可以快速地绘制散点图或气泡图 。
语法:
scatter(x, y, s=None, c=None, marker=None, cmap=None, linewidths=None, edgecolors=None, *, **kwargs)
x,y:表示数据点的位置。
s:表示数据点的大小。
c:表示数据点的颜色。
marker:表示数据点的样式,默认为圆形。
alpha:表示透明度,可以取值为0~1。
linewidths:表示数据点的描边宽度。
edgecolors:表示数据点的描边颜色。
•绘制散点图
import matplotlib.pyplot as plt
import numpy as np
num = 50
x = np.random.rand(num)
y = np.random.rand(num)
plt.scatter (x, y)
plt.show()
•绘制气泡图
import matplotlib.pyplot as plt
import numpy as np
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.8 绘制箱型图
使用pyplot的boxplot()函数可以快速地绘制箱形图。
语法:
boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, *, data=None)
x:绘制箱形图的数据。
sym:表示异常值对应的符号,默认为空心圆圈。
vert:表示是否将箱形图垂直摆放,默认为垂直摆放。
whis:表示箱形图上下须与上下四分位的距离,默认为1.5倍的四分位差。
positions:表示箱体的位置。
widths:表示箱体的宽度,默认为0.5。
patch_artist:表示是否填充箱体的颜色,默认不填充。
meanline:是否用横跨箱体的线条标出中位数,默认不使用。
showcaps:表示是否显示箱体顶部和底部的横线,默认显示。
showbox:表示是否显示箱形图的箱体,默认显示。
showfliers:表示是否显示异常值,默认显示。
labels:表示箱形图的标签。
boxprops:表示控制箱体属性的字典。
•绘制不显示异常值的箱形图
import matplotlib.pyplot as plt
import numpy as np
data = np.random.randn(100)
plt.boxplot(data, eanline=True, widths=0.3, patch_artist=True,
showfliers=False)
plt.show()
使用pyplot的polar()函数可以快速地绘制雷达图。
polar(theta, r, **kwargs)
theta:表示每个数据点所在射线与极径的夹角。
r:表示每个数据点到原点的距离。
霍兰德人雷达图
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
radar_labels = np.array(['研究型(I)', '艺术性(A)', '社会性(S)', '企业型(E)', '常规性(C', '现实型(R)'])
data = np.array([[0.4, 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.85, 0.45, 0.40],
[0.34, 0.31, 0.38, 0.40, 0.92, 0.28]])
data_labels = ('艺术家', '实验员', '工程师', '推销员', '社会工作者', '记事员')
angles = np.linspace(0, 2 * np.pi, 6, endpoint=False) # 设置雷达图的角度,用于平切开一个圆面
'''
np.linspace(start.stop, num,endpoint=Ture)
参数:
start:scalar(标量) 序列的起始点
stop:scalar(标量) 序列的结束点
num:int 生成的样本数,默认是50。必须是非负
endpoint:bool 如果是真,则一定包括stop,如果为False,一定不会有stop
'''
data = np.concatenate((data, [data[0]]))
angles = np.concatenate((angles, [angles[0]]))
'''
np.concatenate((arr,arr),axis=1)
参数:(数据源1,数据源2),axis是方向:1是行,0是列
注意:
1.级联的参数是列表,一定要加中括号或小括号
2.维度必须相同
3.性状相符:在维度保持一致的前提下,
如果进行横向(axis=1)级联,必须保证进行级联的数组行数保持一致
如果进行纵向(axis=0)级联,必须保证进行级联的数组列数保持一致
4.可通过axis参数改变级联的方向
'''
fig = plt.figure(facecolor='white')
'''
figure(num-None,figsize=None,dpi=None,facecolor=None,edgecolor=None,frameon=True)
num:图像编号或名称,数字为编号,字符串为名称
figsize:指定figure的宽和高,单位为英寸
dpi:指定绘图对象的分辨率,即每英寸多少像素,缺省值 为80
facecolor:背景的颜色
edgecolor:边框的颜色
frameon:是否显示边框
'''
plt.subplot(111, polar=True)
'''
subplot(nrows,ncols,plot_number)
这个函数用来表示把figure分成nrows*ncols的子图表示
nrows:子图的行数
ncols:子图的列数
plot_numbel:索引值,表示把图画在第plot_number个位置
plt.subplot(232),将figure分成2*3=6个子图区域,第三个参数2表示将生成的图画在第二个位置
'''
plt.plot(angles, data, 'o-', linewidth=1, alpha=0.2)
'''
plt.plot(x,y,format_string,**kwargs)
x: x轴数据,列表或数组,可选
y:y轴数据,列表或数组
format_string:控制曲线的格式字符串,可选
**kwargs:第二组或更多,可画多条曲线
'''
plt.fill(angles, data, alpha=0.25) # 区域填充的函数
plt.thetagrids(angles * 180 / np.pi) # numpy中数学函数的三角函数
plt.figtext(0.52, 0.95, '霍兰德人格分析', ha='center', size=20)
'''
0.52:表示横坐标
0.95:表示纵坐标
’霍兰德人格分析‘:表示要添加的文本内容
ha:水平对齐
va:垂直对齐
fontsize:文本字体大小
'''
legend = plt.legend(data_labels, loc=(0.95, 0.80), labelspacing=0.1)
plt.setp(legend.get_texts(), fontsize='large')
plt.grid(True)
plt.savefig('holland_radar.jpg')
plt.show()
2.0 绘制误差棒图
使用pyplot的errorbar()函数可以快速地绘制误差棒图。
语法:
errorbar(x, y, yerr=None, xerr=None, fmt='', ecolor=None, *, data=None, **kwargs)
x,y:表示数据点的位置。
xerr,yerr:表示数据的误差范围。
fmt:表示数据点的标记样式和数据点之间连接线的样式。
elinewidth:表示误差棒的线条宽度。
capsize:表示误差棒边界横杆的大小。
capthick:表示误差棒边界横杆的厚度。
•绘制误差棒图
import matplotlib.pyplot as plt
import numpy as np
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()
图表样式美化
表格数据来源:
import matplotlib.pyplot as plt
import matplotlib as mpl
import pandas as pd
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 设置简黑字体
mpl.rcParams['axes.unicode_minus'] = False # 解决‘-’bug
datafile = 'path';
data = pd.read_excel(datafile)
# 设置画布大小
plt.figure(figsize=(10, 5))
# 设置图标标题,并给坐标轴加上标签
plt.title("不同季度各产品销售额", fontsize=24)
plt.xlabel("季度", fontsize=14)
plt.ylabel("销售额(万元)", fontsize=14)
plt.plot(data['季度'], data['产品A'], color="deeppink", linewidth=2, linestyle=':', label='产品A', marker='o')
plt.plot(data['季度'], data['产品B'], color="darkblue", linewidth=2, linestyle='--', label='产品B', marker='*')
plt.plot(data['季度'], data['产品C'], color="goldenrod", linewidth=2, linestyle='-', label='产品C', marker='+')
# 设置刻度标记的大小
plt.legend(loc=2)
plt.show()