1. 程式人生 > >三流Mayavi操作-Mayav-2.1.1-barchart繪製

三流Mayavi操作-Mayav-2.1.1-barchart繪製

影象繪製

繪製圖形就必須要用到繪圖函式

繪圖函式

barchar,contour3d,contour_surf,flow,imshow,mesh, plot3d,points3d,quiver3d,surf,triangular_mesh

.barchar

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))

在這裡插入圖片描述