python绘图系统27:matplotlib中平面坐标、极坐标和三维坐标的所有绘图函数

文章目录

    • 绘图函数列表
    • 为DrawType添加这些绘图函数
    • 绘图类别跳转坐标系
    • 坐标
    • 源代码

绘图函数列表

下面整理了几乎所有matplotlib中的绘图函数,及其在不同坐标轴下的表现。

函数 类别 2D polar 3D 备注
imshow 图像 X
pcolormesh 伪彩图 [X,Y,]Z X,Y,Z
plot 曲线图 x[,y] x[,y] x,y[,z]
scatter 散点图 x,y/X,Y x,y x,y,[,z] 可为任意维度
stem 茎叶图 x,y x,y x,y[,z]
step 阶梯图 x,y x,y x,y[,z]
bar 条形图 x,y x,y x,y[,z]
barh 横向条形图 x,y x,y
stackplot 填充线图 x,y x,y
plot_surface 曲面图 x,y,z x,y必须是网格
plot_wireframe 网格图 x,y,z x,y必须是网格
plot_trisurf 三角面图 x,y,z x,y,z是一维数组
errorbar 误差线 x,y
xerr,yerr
x,y
xerr,yerr
x,y,z
xerr,yerr,zerr
fill_between 纵向区间图 x,y1,y2 x,y1,y2
fill_betweenx 横向区间图 y, x1, x2 x,y1,y2
contour 等高线 [x,y,]z [x,y,]z x,y,z
contourf 填充等高线 [x,y,]z [x,y,]z x,y,z
quiver 向量场图 x,y,u,v x,y,u,v x,y,z,u,v,w
streamplot 流场图 x,y,u,v x,y,u,v
barbs 风场图 x,y,u,v x,y,u,v
hist 直方图 x x x
boxplot 箱线图 x x x
violinplot 小提琴图 x x
enventplot 信封图 x x
hist2d 二维直方图 x,y x,y
hexbin 钻石图 x,y x,y
pie 饼图 x x
tricontour 自由等高线 x,y,z x,y,z x,y,z
tricontourf 自由填充等高线 x,y,z x,y,z x,y,z
tricolor 自由伪彩图 x,y,z
triplot 三角骨架图 x,y

为DrawType添加这些绘图函数

之所以闲得无聊总结matplotlib中的绘图函数,是为了在Python绘图系统中正确第调用它们。

有了这些绘图类别后,首先绘图字典需要更新,这个字典不能做成全局变量,因为其中的ax,其实是作为函数参数传递进来的。

funcDct = {
    "点线图"  : ax.plot,    "曲线图" : ax.plot, 
    "散点图"  : ax.scatter, 
    "图像"    : ax.imshow,  "伪彩图" : ax.pcolormesh, 
    "条形图"  : ax.bar,     "横向条形图": ax.barh, 
    "茎叶图"  : ax.stem,    "阶梯图": ax.step,
    "填充图"  : ax.stackplot, 
    "误差线"  : ax.errorbar, 
    "区间图"  : ax.fill_between, "横向区间图": ax.fill_betweenx, 
    "曲面图"  : ax.plot_surface, 
    "网格图"  : ax.plot_wireframe,
    "三角面图": ax.plot_trisurf,
    "等高线"  : ax.contour, "填充等高线" : ax.contourf,
    "向量场图": ax.quiver,  "流场图":ax.streamplot,
    "风场图"  : ax.barbs, 
    "直方图"  : ax.hist,    "二维直方图":ax.hist2d,
    "钻石图"  : ax.hexbin,  "信封图"  : ax.enventplot, 
    "箱线图"  : ax.boxplot, "小提琴图":violinplot,
    "饼图"    : ax.pie,
    "自由等高线" : ax.tricontour,
    "自由填充等高线" : ax.tricontourf,
    "自由伪彩图" : ax.tricolor,
    "三角骨架图" : ax.triplot
}

然后据此更新self.TYPES,

self.TYPES = [
    "点线图", "曲线图", "散点图", "图像", "伪彩图" , 
    "条形图", "横向条形图", "茎叶图", "阶梯图", "填充图", 
    "误差线", "区间图", "横向区间图",  "曲面图",  
    "网格图", "三角面图", "等高线",  "填充等高线",
    "向量场图", "流场图", "风场图",  "直方图", "二维直方图", 
    "钻石图", "信封图", "箱线图", "小提琴图", "饼图", 
    "自由等高线", "自由填充等高线" ,"自由伪彩图" ,"三角骨架图"]

绘图类别跳转坐标系

这些绘图函数建议使用的坐标系如下表

绘图函数 图像类别 建议的坐标
imshow 图像 None
plot_surface 曲面图 3d
plot_wireframe 网格图 3d
plot_trisurf 三角面图 3d
tricontour 自由等高线 None, polar, 3d
plot 曲线图 None, polar, 3d
scatter 散点图 None, polar, 3d
stem 茎叶图 None, polar, 3d
step 阶梯图 None, polar, 3d
bar 条形图 None, polar, 3d
errorbar 误差线 None, polar, 3d
contour 等高线 None, polar, 3d
quiver 向量场图 None, polar, 3d
pcolormesh 伪彩图 None, polar
barh 横向条形图 None, polar
stackplot 填充线图 None, polar
fill_between 区间图 None, polar,
fill_betweenx 横向区间图 None, polar,
streamplot 流场图 None, polar
barbs 风场图 None, polar
violinplot 小提琴图 None, polar
enventplot 信封图 None, polar
hist2d 二维直方图 None, polar
hexbin 钻石图 None, polar
pie 饼图 None, polar
tricolor 自由伪彩图 None, polar
triplot 三角骨架图 None, polar
contourf 填充等高线 None, polar
tricontourf 自由填充等高线 None, polar
hist 直方图 None, polar
boxplot 箱线图 None, polar
tricontour 自由等高线 None, polar, 3d
plot 曲线图 None, polar, 3d
scatter 散点图 None, polar, 3d
stem 茎叶图 None, polar, 3d
step 阶梯图 None, polar, 3d
bar 条形图 None, polar, 3d
errorbar 误差线 None, polar, 3d
contour 等高线 None, polar, 3d
quiver 向量场图 None, polar, 3d

故更改cbTypeChanged函数如下

def cbTypeChanged(self, evt):
    t = self.drawVars['type'].get()
    p = self.drawVars['proj'].get()
    NO3D = ("曲线图", "散点图", "茎叶图", "条形图", "误差线",
        "等高线", "向量场图", "自由等高线")
    if t in ("图像"):
        self.wDct['proj']['value'] =  ("None")
    elif t in ("曲面图", "网格图", "三角面图"):
        self.wDct['proj']['value'] =  ("3d")
    elif t in NO3D:
        self.wDct['proj']['value'] =  ("None", "3d", "polar")
    else:
        self.wDct['proj']['value'] =  ("None", "polar")
    
    projs = self.wDct['proj']['value']
    if p not in projs:
        self.drawVars['proj'].set(projs[0])        
    self.cbProjChanged(None)

坐标

接下来要为这些绘图函数分类,发现最特殊的是imshow,只支持平面直角坐标;然后是三个三维绘图函数,只支持三维直角坐标,剩下的基本都同时支持平面直角和极坐标。

def cbTypeChanged(self, evt):
    t = self.drawVars['type'].get()
    p = self.drawVars['proj'].get()
    NO3D = ("曲线图", "散点图", "茎叶图", "条形图", "误差线",
        "等高线", "向量场图", "自由等高线")
    if t in ("图像"):
        self.wDct['proj']['value'] =  ("None")
    elif t in ("曲面图", "网格图", "三角面图"):
        self.wDct['proj']['value'] =  ("3d")
    elif t in NO3D:
        self.wDct['proj']['value'] =  ("None", "3d", "polar")
    else:
        self.wDct['proj']['value'] =  ("None", "polar")
    
    projs = self.wDct['proj']['value']
    if p not in projs:
        self.drawVars['proj'].set(projs[0])        
    self.cbProjChanged(None)

最后,是坐标的变化,直角坐标系下的变化为

def cbProjNone(self, t):
    if t in ("点线图", "曲线图"):
        self.wDct['dim']['value'] = ('x', 'xy')
    elif t in ("图像", "直方图", "饼图", "箱线图", "小提琴图", "信封图"):
        self.wDct['dim']['value'] = ('x')
    elif t in ("误差线", "向量场图", "流场图", "风场图"):
        self.wDct['dim']['value'] = ('xyuv')
    elif t in ("伪彩图", "等高线", "填充等高线"):
        self.wDct['dim']['value'] = ('x', 'xyz')
    elif t in ("区间图", "横向区间图", "自由等高线", "自由伪彩图", "自由填充等高线"):
        self.wDct['dim']['value'] = ('xyz')
    else:
        self.wDct['dim']['value'] = ('xy')

经过对比发现,极坐标情况下除了没有imshow之外,其他绘图函数的坐标轴的个数与直角坐标基本相同,所以就直接调用cbProjNone了。

def cbProjPolar(self, t):
    self.cbProjNone(t)

相比之下,三维坐标的情况可能更加简单一些

def cbProj3d(self, t):
    if t  in ("向量场图", "误差线"):
        self.wDct['dim']['value'] = ('xyzuvw')
    elif t in ("曲线图", "散点图", "茎叶图", "阶梯图", "条形图"):
        self.wDct['dim']['value'] = ('xy', 'xyz')
    else:
        self.wDct['dim']['value'] = ('xyz')

至此,就成功载入了几乎所有matplotlib中的函数。

源代码

Python绘图系统:

  • 基础:将matplotlib嵌入到tkinter 简单绘图系统 数据导入三维绘图系统
  • 自定义控件:坐标控件坐标列表控件多组数据绘图系统极坐标绘图风格风格控件
  • 图表类型和风格:散点图和条形图混合类型图表多子图定制绘图风格
  • 坐标设置进阶:动态更新组件导入外部文件导入txt
  • 动图绘制:动图绘制实现动图绘制系统
  • 坐标列表进阶:导出数据系统菜单批量文件导入辅助坐标轴
  • 绘图类型进阶:坐标映射八种绘图函数坐标和绘图函数设置所有绘图函数

你可能感兴趣的:(matplotlib,tkinter,绘图系统,python,自定义控件)