二、Matplotlib 简介
1.matplotlib 对象总览
在matplotlib中,整个
图像为一个Figure对象。在
Figure对象中可以包含一个,
或者多个Axes对象。每个
Axes对象都是一个拥有自己
坐标系统的绘图区域。
一个 Figure可以理解成
一个画布或装图片的容器,
是绘图的承载对象,画布上
有很多绘图方法可供使用。
Title为标题。Axis为坐标轴,
Label为坐标轴标注。Tick
为刻度线,Tick Label为刻
度注释。
2. Matplotlib 基本绘图方式
调用 figure 创建一个绘图对象: plt.figure(figsize=(8,4))
#也可以不创建绘图对象直接调用接下来的plot函数直接绘图,matplotlib会为我们自动创建一个绘图对象。
#如果需要同时绘制多幅图表的话,可以是给figure传递一个整数参数指定图标的序号,
#如果所指定序号的绘图对象已经存在的话,将不创建新的对象,而只是让它成为当前绘图对象。
# figsize: 指定绘图对象的宽度和高度,单位为英寸;
# dpi: 指定绘图对象的分辨率,每英寸多少个像素,缺省值为80。因此本例中所创建的图表窗口的宽度为8*80 = 640像素,高度为4*80像素质。
三、Matplotlib中的一个最简单的绘图(1/3)
安装:matplotlib
pip install matplotlib
#代码的实现
import matplotlib.pyplot as plt
#调用figure创建一个绘图对象:
plt.figure(figsize=(8,4)
#调用plot的plot方法,将x和y坐标,一一对应
plt.plot([1,2,3],[5,7,4])
plt.show()#显示图形
四、美化图表- 为图表加入图例、标题与标签(1/3)
#导入matplotlib
import matplotlib.pyplot as plt
#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei’]
#用来正常显示负号
plt.rcParams['axes.unicode_minus']=False
plt.figure(figsize=(8,4)
x=[1,2,3]
y=[5,7,4]
x2=[1,2,3]
y2=[10,14,12]
plt.plot(x,y,label='第一条线')
plt.plot(x2,y2,label='第二条线')
#使用plt.xlabel和plt.ylabel,我们可以为这些相应的轴创建标签。接下来,我们可以使用plt.title建
图的标题,然后我们可以使用
plt.legend()生成默认图例。
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.title('为图表加入\n图例.标题与标签')
plt.legend()
plt.show()
利用Matplotlib绘制常见图表
2.1. 绘制折线图
适用场景:折线图适合二维的大数据集,还适合多个二维数据集的比较。一般用来表示趋势的变化,横一 般为日期字段
优势:容易反应出数据变化的趋势。
plt.plot默认是折现图
x = [1,2,3,4,5,6,7,8]
y = [5,2,4,2,1,4,5,2]
plt.plot(x,y, label='折线图')
plt.xlabel('x')
plt.ylabel('y')
plt.title('绘制折线图')
plt.legend()
plt.show()
2.2. . 绘制柱状图/条形图
利用 Matplotlib 绘制常见图表
适用场景:显示各个项目之间的比较情况,和柱状图类似的作用
优势:每个条都清晰表示数据,直观
劣势:柱状图的局限在于只适用中小规模的数据集
延伸图表:堆积条形,百分比堆积条形图
#plt.bar 为我们创建柱状图。如果你没有明确选择一种颜色,那么虽然做了多个图,所有的条看起来会一样。 这让我们有机会使用一个新的Matplotlib自定义选项你可以在任何类型的绘图中使用颜色,例如g为绿色,b为蓝色,r为红色,等等。 你还可以使用十六进制颜色代码,如#191970。
plt.bar([1,3,5,7,9],[5,2,7,8,2], label=“柱状图-01")
plt.bar([2,4,6,8,10],[8,6,2,5,6], label="柱状图-02",color='g’)
plt.legend()
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.title('MatplotLib绘制柱状图')
plt.plot()
…….
plt.barh([1,3,5,7,9],[5,2,7,8,2], label="条形图-
01")
plt.barh([2,4,6,8,10],[8,6,2,5,6], label="条形
图-02", color=‘g’)
……
• plt.barh 为我们创建条形图。本质上条形图
就是横向的柱状图,故两个的配置几乎完全
相同
• 不同的是一般用柱状图表达数据较少的数据,
如果数据量较大(超过10条),建议可以用
条形图
2.3. 绘制直方图
利用 Matplotlib 绘制常见图表直方图又称质量分布图,它是表示资料变化情况的一种
主要工具。用直方图可以解析出资料的规则性,比较直观地看出产品质量特性的分布状态,对于资料分布状况一目了然,便于判断其总体质量分布情况。
直方图非常像条形图,倾向于通过将区段组合在一起来显示分布。这个例子可能是年龄的分组,或测试的分数。 我们并不是显示每一组的年龄,而是按照 20 ~ 25,25 ~ 30...等等来显示年龄。
对于plt.hist,你首先需要放入所有的值,然后指定放入哪个桶或容器。在我们的例子中,我们绘制一堆年龄,并希望以 10 年的增量来显示它们。我们将条形的宽度设为rwidth=0.8,但是如果你想让条形变或者变窄,你可以选择其他的宽度。
population_ages =
[22,55,62,45,21,22,34,42,42,4,99,102,110,120,12
1,122,130,111,115,112,80,75,65,54,44,43,42,48]
bins =
[0,10,20,30,40,50,60,70,80,90,100,110,120,130]
plt.hist(population_ages, bins, histtype='bar')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Interesting Graph\nCheck it out')
plt.legend()
plt.show()
2.4. 绘制饼图
适用场景:显示各项的大小与各项总和的比例。适用简单的占比比例图,在不要求数据精细的情况适。
优势:明确显示数据的比例情况,尤其合适渠道来源等场景 劣势:不会具体的数值,只是整体的占比情况。
• 在plt.pie中,我们需要指定『切片』,这是每个部分的相对大小。然后,我们指定相应切片的颜色列表。
• 接下来,我们可以选择指定图形的『起始角度』。这使你可以在任何地方开始绘图。在我们的例子中,我们为饼图选择了 90 度角,这意味着第一个部分是一个竖直线条。
• 接下来,我们可以选择给绘图添加一个字符大小的阴影,然后我们甚至可以使用explode拉出一个切片。我们总共有四个切片,所以对于explode,如果我们不想拉出任何切片,我们传入0,0,0,0。如果我们想要拉出第一个切片,我们传入0.1,0,0,0。
• 最后,我们使用autopct,选择将百分比放置
到图表上面。
核心代码:
slices = [7,2,2,13]
activities = ['sleeping','eating','working','playing']
cols = ['c','m','r','b']
plt.pie(slices,
labels=activities,
colors=cols,
startangle=90,
shadow= True,
explode=(0,0.1,0,0),
autopct='%1.1f%%')
plt.title('饼图')
plt.show()
2.5. 绘制散点图
适用场景:显示若干数据系列中各
数值之间的关系,类似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='k', s=25,marker="o")数据样点的标识
plt.xlabel('x')
plt.ylabel('y')
plt.title('Interesting Graph\nCheck it out')
plt.legend()
plt.show()
2.6. 绘制堆叠图
堆叠图用于显示『部分对整体』随时间的关系。 堆叠图基本上类似于饼图,只是随时间而变化。
让我们考虑一个情况,我们一天有24 小时,我们想看看我们如何花费时间。 我们将我们的活动分为:
睡觉,吃饭,工作和玩耍。想看每个活动的占比及分布情况,可以考虑堆叠图
• 让我们考虑一个情况,我们一天有 24 小时,
我们想看看我们如何花费时间。 我们将我们
的活动分为:睡觉,吃饭,工作和玩耍。
• 我们假设我们要在 5 天的时间内跟踪它,因
此我们的初始数据将如右所示
• 因此,我们的x轴将包括day变量,即 1, 2, 3,
4 和 5。然后,日期的各个成分保存在它们
各自的活动中.
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.stackplot(days,
sleeping,eating,working,playing,#这里的days默认为了自变量
colors=['m','c','r','k'])
plt.xlabel('x')
plt.ylabel('y')
plt.title('堆叠图')
plt.show()
绘制堆叠图(重构)
#先是定义为空的
plt.plot([],[],color='m', label='Sleeping', linewidth=5)
plt.plot([],[],color='c', label='Eating', linewidth=5)
plt.plot([],[],color='r', label='Working', linewidth=5)
plt.plot([],[],color='k', label='Playing', linewidth=5)
plt.stackplot(days, sleeping,eating,working,playing,
colors=['m','c','r','k'])
plt.xlabel('x')
plt.ylabel('y')
plt.title('堆叠图(重构)')
plt.legend()
plt.show()
1、几中常见的matplotlib图形绘制方法
• 画一个折线图:plt.plot()
• 画一个条形图:plt.bar()
• 画一个直方图:plt. hist()
• 画一个饼图:plt. pie()
• 画一个堆叠图:plt. stackplot()
#matplotlib的综合演练
import matplotlib.pyplot as plt
import numpy as np
#from numpy import pi
#这里用到了Matplotlib和numpy模块,linspace在(−π,π)之间分成共256个小段,并把这256个值赋予X。C,S分别是cosine和sine值(X,C,S都是numpy数组)
X = np.linspace(-np.pi,np.pi,256,endpoint=True)#均等分割点
# len(x)
(C,S)=np.cos(X),np.sin(X)
# 这里`b-`是`color="blue",linestyle="-"`的简写形式
#`lw`=`linewidth`,两种写法都是合理的,但是`b-`这种形式,更加简洁
plt.plot(X,C,'b-',label='余弦',lw=2.5)
plt.plot(X,S,'r-',label='正弦',lw=2.5)
#将x和y轴的坐标轴进行缩放
plt.xlim(X.min()*1.5, X.max()*1.5)
plt.ylim(C.min()*1.5, C.max()*1.5)
#改变x和y坐标的刻度
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi],
[r'$-\pi$',r'$-\pi/2$',r'$0$' r'$\pi/r'$-\pi$',r'$-\pi/2$',r'$0$',r'$\pi/])#\为转义
plt.yticks([-1,0,1])
#把坐标轴放在中间
ax=plt.gca() #通过plt.gca()获得当前的Axes对象ax
ax.spines['right'].set_color('none')#右边的
#先把右边和上边的边界设置为不可见
ax.spines['top'].set_color('none')#上面的
#设置x和y轴的刻度的位置下方和左方
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
#然后把下边界和左边界移动到0点
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))
#取t=2*na.pi/2曲线上点的标注
#画出折线
t=2*np.pi/3
plt.plot([t,t],[0,np.sin(t)], color ='red', linewidth=2.5, linestyle="--")
plt.plot([t,t],[0,np.cos(t)], color ='blue', linewidth=2.5, linestyle="--")
#标注点
plt.scatter([t,],[np.cos(t),], 50, color ='blue')
plt.scatter([t,],[np.sin(t),], 50, color ='red')
#添加注释
# plt.annotate(r'')函数
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=.2"))#注释点和注释文字之间的连接方式
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=.2"))
#plt.plot(X, C, 'b-',lw=2.5)
#plt.plot(X, S, 'r-',lw=2.5)
#区分正弦余弦
plt.plot(X, C, 'b-',lw=2.5, label='cosine')
plt.plot(X, S, 'r-',lw=2.5, label='sine')
plt.legend(loc='upper left’)#显示的位置
#获取x和y轴的所有刻度label,并修改文体
for label in ax.get_xticklabels() + ax.get_yticklabels():
label.set_fontsize(18)
label.set_bbox(dict(facecolor='w',edgecolor='None',alpha=0.4))
plt.legend(loc='upper left')
plt.show()
#总结
• 利用np.linspace(-np.pi,np.pi,256,endpoint=True)
可以快速生产数据
• 通过plt.gca()获得当前的Axes对象ax
• 通过plt.xlim()方法来实现图表的留白
• 通过plt.xticks()、plt.yticks() 来设置坐标轴刻度
• 通过plt.annotate() 方法来为图表添加注释
• for label in ax.get_xticklabels() + ax.get_yticklabels():
方式来遍历图表中的label对象
4.1. 柱状/条形图高级
from matplotlib import pyplot as plt
import numpy as np
import numpy as pi
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
# 取出一张白纸
fig=plt.figure(1)
# 确定绘图范围,由于只需要画一张图,所以我们将整
张白纸作为绘图的范围
# 111: 表示设置绘图范围为1行1列,最后一个1代输出到第1块画布上(目前只有1块)
ax1=plt.subplot(111)
# 整理我们准备绘制的数据
data=np.array([15,20,18,25])
#定义宽度
width=0.5
#定义坐标刻度
x_bar=np.arange(4)
#通过ax1对象在axl坐标系统中绘制庄组昂图
rect=ax1.bar(x=x_bar,height=data,width=width,color="lightblue")
#修改x轴的坐标的刻度
ax1.set_xticks(x_bar)
ax1.set_xticklabels(("第一季度","第二季度","第三季度","第四季度"))
#设置y轴坐标的标注
ax1.set_ylabel("销量(单位:万件)")
#设置标题
ax1.set_title("2017年季度销售量统计")
#显示网格
ax1.grid(True)
#放大
ax1.set_ylim(0,28)
#在axl坐标系中(2,25)的位置添加一些文字
#ax1.text(2,25,"aaa")
for rec in rect:
x=rec.get_x()
height=rec.get_height()
ax1.text(x+0.2,1.02*height,str(height)+'W')#在相应的坐标位置添加文字
plt.show()
from matplotlib import pyplot as plt
import numpy as np
import numpy as pi
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
import csv
x = []
y = []
with open('matplotlib-demo.csv','r') as csvfile:
plots = csv.reader(csvfile, delimiter=',')
for row in plots:
x.append(int(row[0]))
y.append(int(row[1]))
plt.plot(x,y, label='模拟数据')
plt.xlabel('x')
plt.ylabel('y')
plt.title('演示从文件加载数据')
plt.legend()
plt.show()