matplotlib图形的绘制

2021-03-10 20:29:44 浏览数 (1)

matplotlib是Python编程语言及其数值数学扩展包 NumPy的可视化操作界面。它利用通用的图形用户界面工具包,如Tkinter, wxPython, Qt或GTK ,向应用程序嵌入式绘图提供了应用程序接口(API)。此外,matplotlib还有一个基于图像处理库(如开放图形库OpenGL)的pylab接口,其设计与MATLAB非常类似--尽管并不怎么好用SciPy就是用matplotlib进行图形绘制。

与MATLAB的比较

pyplot是matplotlib的一个模块,它提供了一个类似MATLAB的接口。 matplotlib被设计得用起来像MATLAB,具有使用Python的能力。免费是其优点

与 Gnuplot的比较

gnuplot和matplotlib都是成熟的开源项目。 它们都可以产生多种不同绘图类型。 虽然很难指定一种某人能做而他人不能做的图形类型,但它们仍然具有不同的优点和缺点:

优点

缺点

Matplotlib

带有内置代码的默认绘图样式与Python的深度集成Matlab风格的编程接口(对一些人来说是优点,但对于其他人来说可能是缺点)。图形绘制相较Gnuplot更加美观

高度依赖其他包,如Numpy。只适用于Python:很难/不可能在Python以外的语言中使用。 (但可以从Julia通过PyPlot软件包使用)

Gnuplot

跨语言解决方案:可以用作通过管道或文件以不同语言编写的应用程序(例如GNU Octave,Maxima,JavaGnuplotHybrid)中的绘图引擎。独立程序:没有外部依赖。处理大型数据集时非常快。更容易操纵绘图细节

旧的默认绘图样式:通常需要小的调整以产生有吸引力的图。在开发中活跃成员的数量较少(与Matplotlib相比)。

  • 带有内置代码的默认绘图样式
  • 与Python的深度集成
  • Matlab风格的编程接口(对一些人来说是优点,但对于其他人来说可能是缺点)。
  • 图形绘制相较Gnuplot更加美观
  • 高度依赖其他包,如Numpy。
  • 只适用于Python:很难/不可能在Python以外的语言中使用。 (但可以从Julia通过PyPlot软件包使用)

Gnuplot

  • 跨语言解决方案:可以用作通过管道或文件以不同语言编写的应用程序(例如GNU Octave,Maxima,JavaGnuplotHybrid)中的绘图引擎。
  • 独立程序:没有外部依赖。
  • 处理大型数据集时非常快。
  • 更容易操纵绘图细节
  • 旧的默认绘图样式:通常需要小的调整以产生有吸引力的图。
  • 在开发中活跃成员的数量较少(与Matplotlib相比)。

matplotlib 三层架构

1.Backend层 后端

处理底层的实际绘制 Canvas(画布类)

2.Artist 美工

figure:画板

axes:绘制区域

3.scripting 脚本

坐标轴,线等实际的绘制

matplotlib图形的绘制

将数据进行可视化,更直观的呈现

使数据更加客观、更具说服力

折线图 plt.plot()

用来展示数据的变化趋势

(两张图放在同一个画布中)

代码语言:javascript复制
# 导入matplotlib.pyplot
import matplotlib.pyplot as plt
# 设置图片大小 长高和清晰度 figsize为元组 长和高 dpi是代表清晰度
plt.figure(figsize=(20,8),dpi=100)
# 指定X轴数据
x1 = [1,2,3,4,5,6,7]
# 指定Y轴数据
y1 = [1,5,6,3,8,4,8]
y2 = [2,7,7,6,8,9,9]
# 绘制折线图  color 线条颜色  linestyle 线条样式  label 线条标签  linewidth 线条宽度 marker 节点显示类型 markerfacecolor 节点颜色 markersize 节点大小
plt.plot(x1,y1,color="y",linestyle="--",label="我的折线图",linewidth=2,marker="o",markerfacecolor='blue',markersize=10)
plt.plot(x1,y2,color="b",label="他的折线图",linewidth=3,marker="o",markerfacecolor="k",markersize=10)
# 自定义刻度 x轴
xticks = ["1月","2月","3月","4月","5月","6月","7月"]
# rotation代表刻度字的倾斜度
plt.xticks(x1,xticks,rotation=45)# 设置坐标刻度值的大小以及刻度值的字体
# 设置x轴y轴以及标题的字体大小
fontdict = {'weight': 'normal','size': 30}
# 横坐标描述
plt.xlabel('month',fontdict=fontdict)
# 纵坐标描述
plt.ylabel('result',fontdict=fontdict)
# 标题
plt.title("my result",fontdict=fontdict)
# 设置X轴Y轴刻度字体的大小
plt.tick_params(labelsize=20)
# 坐标轴上显示具体的数据
for a, b in zip(x1, y1):
    plt.text(a, b, b, ha='center', va='bottom', fontsize=30)
# 坐标轴上显示具体的数据
for a, b in zip(x1, y2):
    plt.text(a, b, b, ha='center', va='bottom', fontsize=30)
# 指定标签的位置 loc 0代表最佳位置
plt.legend(loc=0,fontsize=20)
# 显示图片
plt.show()

两张图放置在不同的画布中

代码语言:javascript复制
# 导入matplotlib.pyplot
import matplotlib.pyplot as plt
# 开启字画布 nrows 代表行 ncols 代表列 figsize 画布大小  dpi 清晰度
fig,axes = plt.subplots(nrows=2,ncols=3,figsize=(30,10),dpi=100)
#调整整体空白
fig.tight_layout()
#调整子图间距
plt.subplots_adjust(wspace =0.2, hspace =0.5)
# 指定X轴数据
x1 = [1,2,3,4,5,6,7]
# 指定Y轴数据
y1 = [1,5,6,3,8,4,8]
y2 = [2,7,7,6,8,9,9]
# 设置x轴y轴以及标题的字体大小
fontdict = {'weight': 'normal','size': 30}


# 定义函数,将相同设置的放入同一个函数
def setAxes(axe,y,obj,x1):
    #指定绘图区域
    plt.sca(axe)
    # 指定标签的位置 loc 0代表最佳位置
    plt.legend(loc=0,fontsize=20)
    # 坐标轴上显示具体的数据
    for a, b in zip(x1, y):
        plt.text(a, b, b, ha='center', va='bottom', fontsize=30)
    # 自定义刻度 x轴
    xticks = ["1月","2月","3月","4月","5月","6月","7月"]
    plt.xticks(x1,xticks)
    # 横坐标描述
    plt.xlabel('month',fontdict=fontdict)
    # 纵坐标描述
    plt.ylabel('result',fontdict=fontdict)
    # 标题
    plt.title("{}'s result".format(obj),fontdict=fontdict)
    # 增加对高点
    plt.annotate(
        '',  # 显示字符串
        xy=(x1[y.index(max(y))], max(y)),  # 箭头位置
        xytext=(x1[y.index(max(y))]   0.5,max(y)-1),  # 文本位置
        arrowprops=dict(facecolor='red', shrink=0.1, width=2)  # facecolor:箭头颜色;shrink:箭头的起始和结束位置两侧的空白大小;width:箭头宽度
    )
    # 对文本进行设置
    plt.text(x1[y.index(max(y))] 0.5, max(y)-1, '最高点', fontsize=20, style='italic',color='mediumvioletred')
    # 设置X轴Y轴刻度字体的大小
    plt.tick_params(labelsize=20)
    
    
# 绘制折线图
axes[0,0].plot(x1,y1,color="b",linestyle="-.",label="A的折线图",linewidth=2,marker="o",markerfacecolor='blue',markersize=10)
axes[0,1].plot(x1,y2,color="y",linestyle="-",label="B的折线图",linewidth=3,marker="o",markerfacecolor="k",markersize=10)
axes[0,2].plot(x1,y1,color="k",linestyle="--",label="C的折线图",linewidth=2,marker="o",markerfacecolor='blue',markersize=10)
axes[1,0].plot(x1,y2,color="g",linestyle=":",label="D的折线图",linewidth=3,marker="o",markerfacecolor="k",markersize=10)
axes[1,1].plot(x1,y1,color="c",linestyle="-.",label="E的折线图",linewidth=2,marker="o",markerfacecolor='blue',markersize=10)
axes[1,2].plot(x1,y2,color="r",linestyle="-.",label="F的折线图",linewidth=3,marker="o",markerfacecolor="k",markersize=10)


# 调用函数进行相关的设置
setAxes(axes[0,0],y1,"A",x1)
setAxes(axes[0,1],y2,"B",x1)
setAxes(axes[0,2],y1,"C",x1)
setAxes(axes[1,0],y2,"D",x1)
setAxes(axes[1,1],y1,"E",x1)
setAxes(axes[1,2],y2,"F",x1)

# 图片中的名称
fig.text(0.4, 0.5, "matplotlib折线图",fontsize=40,color='gray',alpha=0.4)

# 保存图片 格式  png  jpg  svg(s矢量图)
plt.savefig("a.png")

# 显示图片
plt.show()

散点图 plt.scatter()

数据的离散聚合程度

不同条件(维度)之间的内在关联关系

代码语言:javascript复制
# 导入matplotlib.pyplot
import matplotlib.pyplot as plt
# 设置图片大小 长高和清晰度 figsize为元组 长和高 dpi是代表清晰度
plt.figure(figsize=(20,8),dpi=100)
# 指定X轴数据
x1 = range(1,32)
x2 = range(51,82)
# 指定Y轴数据
y1 = [11,15,16,9,12,18,14,20,14,17,18,21,12,15,14,17,18,29,16,17,10,17,15,16,15,21,21,26,23,27,22]
y2 = [21,26,25,20,21,29,16,19,17,16,17,19,22,18,17,26,21,16,17,15,11,15,5,13,17,9,11,18,12,18,6]

# 绘制散点图
plt.scatter(x1,y1,label="五月份",color="r")
plt.scatter(x2,y2,label="八月份",color="k")
# 更换坐标轴显示的刻度
xticks =["5月{}日".format(i) for i in x1]
xticks  =["8月{}日".format(i) for i in x1]
plt.xticks((list(x1) list(x2))[::3],xticks[::3],rotation=45)
# 设置x轴y轴以及标题的字体大小
fontdict = {'weight': 'normal','size': 30}
# 横坐标描述
plt.xlabel('月份',fontdict=fontdict)
# 纵坐标描述
plt.ylabel('温度',fontdict=fontdict)
# 标题
plt.title("五月和八月气温的分布情况",fontdict=fontdict)
# 设置X轴Y轴刻度字体的大小
plt.tick_params(labelsize=15)
# 设置标注信息
plt.legend(loc=0)
# 显示图形
plt.show()

柱状图

基本柱状图

代码语言:javascript复制
# 基本柱状图
# 导入matplotlib.pyplot包
import matplotlib.pyplot as plt
# 设置图片大小 和 图片清晰度
plt.figure(figsize=(30,10),dpi=100)
# X轴坐标 以及X轴坐标对应的刻度
x = [1,2,3,4,5,6,7]
xticks = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]
# y轴刻度
y = [24,25,25,27,29,30,19]
# 绘制柱状图
plt.bar(x,y,width=0.3,color="r")
plt.xticks(x,xticks)
# 设置x轴y轴以及标题的字体大小
fontdict = {'weight': 'normal','size': 25}
# 横坐标描述
plt.xlabel('一周',fontdict=fontdict)
# 纵坐标描述
plt.ylabel('温度(单位:摄氏度))',fontdict=fontdict)
# 标题
plt.title("这一周每天的温度情况",fontdict=fontdict)
# 设置X轴Y轴刻度字体的大小
plt.tick_params(labelsize=25)
# 显示Y轴的具体数据
for a,b in zip(x,y):
    plt.text(a, b, b, ha='center', va='bottom', fontsize=30)
plt.show()

堆叠柱状图

代码语言:javascript复制
# 堆叠柱状图
# 导入matplotlib.pyplot包
import matplotlib.pyplot as plt
# 设置图片大小 和 图片清晰度
plt.figure(figsize=(30,10),dpi=100)
# X轴坐标 以及X轴坐标对应的刻度
x = [1,2,3,4,5,6,7]
xticks = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]
# y轴刻度
y1 = [240,250,250,270,290,300,190]
y2 = [240,220,230,290,260,310,200]
# 绘制柱状图
plt.bar(x,y1,width=0.3,fc="r",label="这周每天的收入")
plt.bar(x,y2,width=0.3,fc="y",label="上周每天的收入",bottom=y1,tick_label=xticks)
# 设置x轴y轴以及标题的字体大小
fontdict = {'weight': 'normal','size': 25}
# 横坐标描述
plt.xlabel('一周',fontdict=fontdict)
# 纵坐标描述
plt.ylabel('收入(单位:元)',fontdict=fontdict)
# 标题
plt.title("每天的收入情况",fontdict=fontdict)
# 设置X轴Y轴刻度字体的大小
plt.tick_params(labelsize=25)
# 显示标注位置
plt.legend(loc=0,fontsize=20)
# 显示Y轴的具体数据
for a,b in zip(x,y1):
    plt.text(a, b, b, ha='center', va='bottom', fontsize=25)

# 显示Y轴的具体数据
for a,b in zip(x,y2):
    plt.text(a, b   y1[y2.index(b)], b   y1[y2.index(b)], ha='center', va='bottom', fontsize=25)
plt.show()

并列柱状图

代码语言:javascript复制
# 并列柱状图
# 导入matplotlib.pyplot包
import matplotlib.pyplot as plt
# 设置图片大小 和 图片清晰度
plt.figure(figsize=(30,10),dpi=100)
# X轴坐标 以及X轴坐标对应的刻度
width = 0.3  # 准状图的宽度
x1 = [1,2,3,4,5,6,7]
x2 = [i width for i in x1]
xticks = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]
# y轴刻度
y1 = [240,250,250,270,290,300,190]
y2 = [240,220,230,290,260,310,200]
# 绘制柱状图
plt.bar(x1,y1,width=width,fc="r",label="这周每天的收入")
# 增加底部的是y1
plt.bar(x2,y2,width=width,fc="y",label="上周每天的收入",tick_label=xticks)
# 设置x轴y轴以及标题的字体大小
fontdict = {'weight': 'normal','size': 25}
# 横坐标描述
plt.xlabel('一周',fontdict=fontdict)
# 纵坐标描述
plt.ylabel('收入(单位:元)',fontdict=fontdict)
# 标题
plt.title("每天的收入情况",fontdict=fontdict)
# 设置X轴Y轴刻度字体的大小
plt.tick_params(labelsize=25)
# 显示标注位置
plt.legend(loc=0,fontsize=20)
# 显示Y轴的具体数据
for a,b in zip(x1,y1):
    plt.text(a, b, b, ha='center', va='bottom', fontsize=25)

# 显示Y轴的具体数据
for a,b in zip(x2,y2):
    plt.text(a, b, b, ha='center', va='bottom', fontsize=25)
plt.show()

条形柱状图

代码语言:javascript复制
# 条形柱状图
# 导入matplotlib.pyplot包
import matplotlib.pyplot as plt
# 设置图片大小 和 图片清晰度
plt.figure(figsize=(30,10),dpi=100)
# X轴坐标 以及X轴坐标对应的刻度
x = [1,2,3,4,5,6,7]
xticks = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]
# y轴刻度
y = [24,25,25,27,29,30,19]
# 绘制柱状图
plt.barh(x,y,color="r")
plt.yticks(x,xticks)
# 设置x轴y轴以及标题的字体大小
fontdict = {'weight': 'normal','size': 25}
# 横坐标描述
plt.ylabel('一周',fontdict=fontdict)
# 纵坐标描述
plt.xlabel('温度(单位:摄氏度))',fontdict=fontdict)
# 标题
plt.title("这一周每天的温度情况",fontdict=fontdict)
# 设置X轴Y轴刻度字体的大小
plt.tick_params(labelsize=25)
# 显示Y轴的具体数据
for a,b in zip(x,y):
    plt.text(b, a, b, ha='center', va='bottom', fontsize=30)
plt.show()

直方图

代码语言:javascript复制
# 直方图
# 设置图片大小  清晰度
plt.figure(figsize=(30,8),dpi=100)
# x轴数据
a=[131,  98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115,  99, 136, 126, 134,  95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117,  86,  95, 144, 105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123,  86, 101,  99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140,  83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144,  83, 123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137,  92,121, 112, 146,  97, 137, 105,  98, 117, 112,  81,  97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112,  83,  94, 146, 133, 101,131, 116, 111,  84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]
# 组距
d = 5
# 需要分成多少组  既可以传多少个组  可以传入每个坐标的节点
num = (max(a)-min(a))//d   1 if (max(a)-min(a))%d==0 else (max(a)-min(a))//d   2
# x轴的区间划分
bin = [min(a) d*i for i in range(num)]
# 直方图
plt.hist(a,bin)
plt.xticks(bin)
plt.tick_params(labelsize=20)
fontdict = {'weight': 'normal','size': 30}
plt.xlabel("电影观看时长",fontdict=fontdict)
plt.ylabel("电影的观看量",fontdict=fontdict)
plt.title("不同电影三天的票房对比",fontdict=fontdict)
# 网格线
plt.grid(linestyle="-",alpha=0.6)
# 显示图片
plt.show()

饼图 plt.pie()

分布比例情况

代码语言:javascript复制
# 饼图
# 设置图片大小 清晰度
plt.figure(figsize=(20,8),dpi=100)
# 需要进行分布的数据
movie_name = ['Cross', 'Cone', 'Egg', 'Teardrop', 'Chevron', 'Diamond', 'Cylinder','Rectangle', 'Flash', 'Cigar', 'Changing', 'Formation', 'Oval', 'Disk','Sphere', 'Fireball', 'Triangle', 'Circle', 'Light']
# 各个需要分布数据的具体数量
place_count = [  287,   383,   842,   866,  1187,  1405,  1495,  1620,  1717,2313,  2378,  3070,  4332,  5841,  6482,  7785,  9358,  9818, 20254]
# 进行饼图的绘制
plt.pie(x=place_count,labels=movie_name,autopct="%3.2f%%",colors=['b','r','g','y','c','m','y','k','c','g','g'])
# 设置图形的样式
plt.axis("equal")
# loc  0表示最佳位置
plt.legend(loc=0,fontsize=15)
# 设置标题
fontdict = {'weight': 'normal','size': 30}
plt.title("DEMO",fontdict=fontdict)
# 展示图形
plt.show()

0 人点赞