安装命令:pip install matplotlib
使用环境:jupyter
开发工具版本:python3
下一篇的连接:https://blog.csdn.net/sinat_30353259/article/details/80834208
调用 figure 创建一个绘图对象: plt.figure(figsize=(8,4))
⚫ 也可以不创建绘图对象直接调用接下来的plot函数直接绘图, matplotlib会为我们自创建一个绘图对象。
⚫ 如果需要同时绘制多幅图表的话,可以是给figure传递一个整数参数指定图标的序号,如果所指定序号的绘图对象已经存在的话,将不创建新的对象,而只是让它成为当前绘图对象。
⚫ figsize: 指定绘图对象的宽度和高度,单位为英寸;
⚫ dpi: 指定绘图对象的分辨率,每英寸多少个像素,缺省值为80。因此本例中所创建的
图表窗口的宽度为880 = 640像素,高度为480像素质。
from matplotlib import pyplot as plt
# 中文转换
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
# 创建画板
plt.Figure(figsize=(8,4))
#在画板对象上绘制一条折线图
plt.plot([1,2,3,4],[4,5,3,15],label='第一条折线') # label是小图标的注解
plt.plot([2,3,4],[10,14,12],label = '第二条折线')
# 进一步完善图表
#添加x轴标签,y轴标签
plt.xlabel('X轴')
plt.ylabel('Y轴')
# 为图表添加标题
plt.title('简单的折线图')
# 为图表添加小图标
plt.legend(loc = 'upper right') #确定小图标的位置
# 显示图表
plt.show() # 在jupyter中不需要打印
from matplotlib import pyplot as plt
# 中文转换
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
⚫ 适用场景:折线图适合二维的大数据集,还适合多个二维数据集的比较。一般用来表示趋势的变化,横轴一般为日期字段
⚫ 优势:容易反应出数据变化的趋势。
x = [1,2,3,4,5,6,7,8]
y = [5,2,4,2,1,4,5,2]
plt.plot(x,y,label='折线图')
plt.title('绘制折线图')
plt.legend(loc = 'upper right')
plt.xlabel('X')
plt.ylabel('Y')
⚫ 适用场景:显示各个项目之间的比较情况,和柱状图类似的作用
⚫ 优势:每个条都清晰表示数据,直观
⚫ 劣势:柱状图的局限在于只适用中小规模的数据集
⚫ 延伸图表:堆积条形图、百分比堆积条形图
x,y = [1,3,5,7,9],[5,2,7,8,2]
x2,y2 = [2,4,6,8,10],[8,6,2,5,6]
plt.bar(x,y,label='柱状图1',color='b')
plt.bar(x2,y2,label='柱状图2',color='g')
plt.title('绘制柱状图')
plt.legend()
plt.xlabel('X')
plt.ylabel('Y')
• plt.barh 为我们创建条形图。本质上条形图就是横向的柱状图,故两个的配置几乎完全相同
• 不同的是一般用柱状图表达数据较少的数据,如果数据量较大(超过10条),建议可以用条形图
x,y = [1,3,5,7,9],[5,2,7,8,2]
x2,y2 = [2,4,6,8,10],[8,6,2,5,6]
plt.barh(x,y,label='条形图1',color='#000000')
plt.barh(x2,y2,label='条形图2',color='#0000FF')
plt.legend()
直方图又称质量分布图,它是表示资料变化情况的一种主要工具。用直方图可以解析出资料的规则性,比较直观地看出产品质量特性的分布状态,对于资料分布状况一目了然,便于判断其总体质量分布情况。
population_ages =[22,55,62,45,21,22,34,42,42,4,99,102,110,120,121,122,130,111,115,112,80,75,65,54,44,43,42,48]
bins =[0,20,40,60,80,100,120,140]
plt.hist(population_ages,bins,histtype='bar',label='年龄分布情况')
plt.xlabel('年龄区间')
plt.ylabel('人数')
plt.legend()
plt.title('年龄分布直方图')
# 显示图表
plt.show()
⚫ 适用场景:显示各项的大小与各项总和的比例。适用简单的占比比例图,在不要求数据精细的情况适用。
⚫ 优势:明确显示数据的比例情况,尤其合适渠道来源等场景
⚫ 劣势:不会具体的数值,只是整体的占比情况。
audience = [2,5,10,3]
types = ['少年','青年','中年','老年']
# 定义每一个扇图的颜色
# colors = ['#ff0000','#00ff00','#cccccc','#000000']
colors = ['c','m','g','b']
plt.pie(audience,
labels=types, #扇形取余的标注
autopct='%1.1f%%', #扇形取余的显示百分比
colors=colors, #扇形区域的颜色
startangle=90, #开始绘制扇形取余的角度
explode = [0.2,0,0,0], # 突出显示某一扇形区,数值取(0-1)之间
shadow=True # 是否显示阴影
)
plt.title("关注世界杯的人数占比")
plt.show()
⚫ 适用场景:显示若干数据系列中各数值之间的关系,类似XY轴,判断两变量之间是否存在某种关联。散点图适用于三维数据集,但其中只有两维数据是需要比较的。另外,散点图还可以看出极值的分布情况
⚫ 优势:对于处理值的分布和数据点的分簇区域(通过设置横纵项的辅助线),散点图都很理想。如果数据集中包含非常多的点,那么散点图便是最佳图表类型
⚫ 劣势:在点状图中显示多个序列看上去非常混乱
x = [1,2,3,4,5,6,7,8]
y = [5,2,4,2,1,4,5,2]
plt.scatter(x,y,label='skitscat',color='b',s=100,marker='v')
'''
x,y是数据的x轴y轴
color 散点图的颜色
s 散点图点形状的大小
marker 是散点图的形状
'''
plt.legend()
plt.title('绘制散点图')
plt.xlabel('X')
plt.ylabel('Y')
⚫ 堆叠图用于显示『部分对整体』 随时间的关系。 堆叠图基本上类似于饼图,只是随时间而变化。
⚫ 让我们考虑一个情况,我们一天有24 小时,我们想看看我们如何花费时间。 我们将我们的活动分为:睡觉,吃饭,工作和玩耍。想看每个活动的占比及分布情况,可以考虑堆叠图
days = [1,2,3,4,5]
sleeping = [7,8,6,11,7]
eating = [2,3,4,3,2]
working = [7,8,7,2,2]
playing = [8,5,7,8,13]
# 创建画布修改画布的大小
plt.figure(figsize=(12,8))
plt.stackplot(days, #时间x轴
sleeping,eating,working,playing, # 堆叠图的数据
colors=['c','b','g','m'])
#为堆叠图加上图例
plt.plot([],[],color='r',label='sleeping',linewidth=5)
plt.plot([],[],color='b',label='eating',linewidth=5)
plt.plot([],[],color='g',label='working',linewidth=5)
plt.plot([],[],color='m',label='playing',linewidth=5)
plt.title('堆叠图')
plt.xlabel('星期')
plt.ylabel('小时')
plt.legend()
from matplotlib import pyplot as plt
import numpy as np
from numpy import pi as PI
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
# 定义x轴数据
X = np.linspace(-np.pi,np.pi,256,endpoint=True)
# 根据X的值求正弦和余弦函数
sin,cos = np.sin(X),np.cos(X)
# 绘制正弦和余弦
plt.plot(X,sin,'b',lw=2.5,label='正弦')
plt.plot(X,cos,'r',lw=2.5,label='余弦')
# 坐标刻度改为3.14 ,#替换X轴坐标中的数值
plt.xticks([-PI,-PI/2,0,PI/2,PI],
[r'$-\pi$',r'$-\pi/2$',r'$0$',r'$\pi/2$',r'$\pi$'])
plt.yticks([-1,0,1])
# 隐藏和平移坐标轴
#获取到Axes对象
ax = plt.gca()
#隐藏右边界和上边界
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
#将x和y轴和Y轴同时拉伸1.5倍
plt.xlim(X.min()*1.5,X.max()*1.5)
plt.ylim(cos.min()*1.5,cos.max()*1.5)
# 设置坐标轴刻度的显示位置
#bottom :将x轴的坐标刻度显示到图表的下方
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
#平移坐标轴
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))
#根据两点绘制一条虚线
#画出需要标注的蓝色的线
t=2*np.pi/3
plt.plot([t,t],[0,np.cos(t)], color ='blue', linewidth=2.5, linestyle="--")
plt.plot([t,t],[0,np.sin(t)], color ='red', linewidth=2.5, linestyle="--")
# 以下代码是:给蓝色的点添加注释
# 用绘制散点图的方法在正弦和余弦图像上分别标注出一个点
plt.scatter([t,],[np.cos(t),], 150, color ='blue')
# 为图像上的两个点标注
plt.annotate(r'$\cos(\frac{2\pi}{3})=-\frac{1}{2}$',
xy=(t, np.cos(t)), xycoords='data',
xytext=(-90, -50), textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=0.5"))
plt.scatter([t,],[np.sin(t),], 150, color ='red')
plt.annotate(r'$\sin(\frac{2\pi}{3})=\frac{\sqrt{3}}{2}$',
xy=(t, np.sin(t)), xycoords='data',
xytext=(+10, +30), textcoords='offset points', fontsize=16,
arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=0.5"))
# 获取x轴和y轴刻度,并设置字体
for label in ax.get_xticklabels()+ax.get_yticklabels():
label.set_fontsize(18)
# edgecolor:为每个刻度设置边框
# facecolor :背景颜色
# alpha 边框的透明度
label.set_bbox(dict(facecolor='w',edgecolor='w',alpha=0.5))
# 显示图表
plt.legend(loc='upper left')
plt.show()
from matplotlib import pyplot as plt
import numpy as np
# 中文转换
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
# 创建一个画板
plt.figure(1)
#为画板划分出多个axes
ax = plt.subplot(111)
#数据准备,定义x轴数据
data = np.array([15,20,18,25])
# 柱状的宽度
width=0.5
# 定义x轴的数据
x_bar = np.arange(4)
#绘制柱状图
rects = ax.bar(x_bar,data,width=width,color = 'lightblue')
# 为柱状图添加高度
for rect in rects:
x = rect.get_x()
height = rect.get_height()
# 添加文字
ax.text(x+0.2,1.02*height,str(height) + 'W')
# 设置x轴的刻度
ax.set_xticks(x_bar)
ax.set_xticklabels(['第一季度','第二季度','第三季度','第四季度'])
# 设置y轴的标签
ax.set_ylabel("销量(单位:万件)")
# 设置x轴的标签
ax.set_xlabel('季度')
# 设置标题
# plt.title()
ax.set_title('2017年季度销售统计')
# 是否显示网格
ax.grid(True)
#拉伸y轴
ax.set_ylim(0,28)
plt.show()
plt.figure(figsize=(6,6),dpi=80)
# 创建第一个画板
plt.figure(1)
# 将画板划分成有两行一列组成的区块,并获取到第一个子区块
ax1 = plt.subplot(211)
#在第一个子区域中绘图
plt.scatter([1,3,5],[2,4,5],marker='v',s=50,color ='b')
#在选中第二个子区域,并绘图
ax2 = plt.subplot(212)
plt.plot([2,4,6],[7,10,15])
# 创建第二个画板并
plt.figure(2)
x = np.arange(4)
y = np.array([15,20,18,25])
#在第二个画板绘制柱状图
plt.bar(x,y)
# 为第二个画板,添加标题
plt.title("第二个画板")
#从第二个画板切换到第一个画板
plt.figure(1)
# 切换到第一个画板的第一个区域
# 为第一个画板的第一个区域添加标题
ax1.set_title('第一个画板的第一个区域')
# 切换到第一个画板的第二个区域
# plt.subplot(212)
ax2.set_title('第一个画板的二个区域')
# 调整每个子图间的间距
plt.tight_layout()