三流Mayavi操作-Mayav-2.1.0-barchart绘制

版权声明:转载请告知征得同意。 https://blog.csdn.net/qq_42731466/article/details/82908206

秉着边学边写边折腾的原则,开始粗糙的工作。真正掌握还是得讲解给别人听。
先给出网课
https://www.icourse163.org/course/BIT-1001871001
Mayavi官方
http://docs.enthought.com/mayavi/mayavi/index.html
(有时候这网站会装死,一般过几个小时就会活过来)

2.0.简述(1’)

2.1 .mlab图形可视化,图像操作(预计10篇)

2.1.0 绘图函数,通用参数
2.1.1 .barchart*当前位置
2.1.2 .mesh

2.2.api操作管线对象,窗口对象

2.2.1 脚本录制

图像绘制

绘制图形就必须要用到绘图函数
这章节只讲barchart

.barchar

相关文档:http://docs.enthought.com/mayavi/mayavi/auto/mlab_helper_functions.html#mayavi.mlab.barchart
这个主要绘制的是histogram-like plots(柱状图)
barchart(s, ...)
barchart(x, y, s, ...)
barchart(x, y, f, ...)
barchart(x, y, z, s, ...)
barchart(x, y, z, f, ...)

这里给出一个官方例子

import numpy as np
from mayavi import mlab
def test_barchart():
    s = np.abs(np.random.random((3,3)))
    #print(s)
    return s
mlab.barchart(test_barchart())
mlab.show()

官方的源代码有点问题,做了一点微调得到图像如下
在这里插入图片描述

[[0.74031579 0.19818875 0.67555398]
[0.98096117 0.84114131 0.47679296]
[0.92585067 0.06436429 0.97646445]]
以上是由random随机的9个柱形图的值(列表的位置就是柱形图的位置)

然后我们再试一下
barchart(x,y,z)

import numpy as np
from mayavi import mlab
x = [1,2,3,3,2]
y = [1,2,3,4,3]
z = [1,1,-1,-1,1]
mlab.barchart(x,y,z)
mlab.xlabel('x')	#为了方便观察添加了xy坐标轴
mlab.ylabel('y')
mlab.show()

图像如下
在这里插入图片描述
这里很容易看得到xoy平面,z的高度只设了1和-1,导致1的颜色就是红色-1的颜色就是蓝色

这里有3件事。
1.柱形图的颜色由其第三个参数决定,也就是高度,对应z
2.观察(1,1)(3,4)这个位置,barchart的绘制起点是立方体的中心
3.水平面的立方体间隔是等间距的,也就是存在间距,纵向是连续的,没有间距,这是合理的这就是柱形图。

这里添加了.xlabel,配色方案仍然是默认的,未修改,z轴的标注是动态的,会乱跑,所以最好加上.zlabel一起把它也固定了,我试过,结果还是乱跑,Emmm,我还没有找到好的解决办法。
(限制它飞来飞去的方法我写在文末) 这里提出几个问题:

1.配色方案和透明度修改时很容易的,但是立方体间距的修改如何实现?
2.barchart的默认样式是长方体,修改样式,圆柱体如何实现?
3.以上两种如果从代码中直接实现应该怎么来写?

上面三个先放一边
我们可以进一步增设一个平面,用一个.mesh,这里暂时借用一下(怀疑有更好的方法)。
2.0
这里我是手动调整了管线,平面的透明度到0.4
代码直接设置也是可行的

import numpy as np
from mayavi import mlab
x = [1,2,3,3,2]
y = [1,2,3,4,3]
z = [1,1,-1,-1,1]
length=5						#绘制的平面xy长宽,此处设置5X5
linex = [[0,length],[0,length]]	#暂时略过,后面专门说mesh
liney = [[0,0],[length,length]]
height = [[0,0],[0,0]]
mlab.barchart(x,y,z)
mlab.mesh(linex,liney,height)
mlab.xlabel('x')
mlab.ylabel('y')
mlab.zlabel('z')
mlab.show() 

如果要用代码(虽然我很不乐意)

import numpy as np
from mayavi import mlab
x = [1,2,3,3,2]
y = [1,2,3,4,3]
z = [1,1,-1,-1,1]
length=5
linex = [[0,length],[0,length]]
liney = [[0,0],[length,length]]
height = [[0,0],[0,0]]
mlab.barchart(x,y,z)
mlab.mesh(linex,liney,height)

s = mlab.gcf()								#这里开始处理管线,一层一层下去,一句也行的。
source = s.children[1]						#因为平面.mesh是barchart之后配置的,所以index是1不是0
manager = source.children[0]
colors = manager.children[0]
surface = colors.children[0]
surface.actor.property.opacity = 0.4		#修改透明度属性

mlab.xlabel('x')
mlab.ylabel('y')
mlab.zlabel('z')
mlab.show()

读者对照管线图自行比较,这里不多说管线,后面再说,一层一层剥洋葱。
在这里插入图片描述
读者可以自行修改各项属性,这里不在管线上继续了。
这里还有一个问题

  1. 怎么把每一个小立方柱的高度z标记出来,还要漂亮,还要sexy?

barchart讲解基本完成,现在给出barchart的所有例子。
1.barchart(s, ...)已经给出 注意:s不只可以接受二维列表,一维也是可以的
2.barchart(x, y, s, ...) s是一个array上面已经给出例子,只不过写的是z
3.barchart(x, y, f, ...) f直接就是函数,(x,y)坐标对应---->f(x,y)的值,其实这个是个很方便的东西

x = np.array([[1,2,3]])
y = np.array([[1,2,3]])
def f(x,y):
    val = x+y
    return val
mlab.barchart(x,y,f(x,y))

在这里插入图片描述

4.barchart(x, y, z, s, ...)
这个可以设置绘制起点

x = [1,2,3,4]
y = [1,2,3,4]
z = [1,2,3,4]
s = [1,2,3,4]
mlab.barchart(x,y,z,s)

在这里插入图片描述

5.barchart(x, y, z, f, …)
这里需要注意的是 xyz 需要一步array()

x = np.array([1,2,3,4])
y = np.array([1,2,3,4])
z = np.array([1,2,3,4])
def f(x,y,z):
val = x+y+z
return val
mlab.barchart(x,y,z,f(x,y,z))
在这里插入图片描述

填坑区:
还有上面的几个思考题汇总

1.配色方案和透明度修改时很容易的,但是barchart间距的修改如何实现?
2.barchart的默认样式是长方体,修改样式,圆柱体如何实现?
3.以上两种如果从代码中直接实现应该怎么来写?
4.怎么把每一个小立方柱的高度z标记出来,还要漂亮,还要sexy?
5.如何固定坐标轴的值,飞来飞去很讨厌?

解决方案是将Fly mode设置为 none即可,可以在代码中直接写进去
scene = gcf()
axe = scene.children[0].children[0].children[0].children[2] #需要注意2是Axes在管线中所在的位置
axe.axes.fly_mode = 'none'
在这里插入图片描述

5.1.旧坑刚填,新坑又现,如何避免使用index索引,毕竟容易搞错?或者有什么更好的解决方法?

更新(18.10.7已更完)
2018.10.07. ——调整目录和排版。

猜你喜欢

转载自blog.csdn.net/qq_42731466/article/details/82908206