三流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
,這裡暫時借用一下(懷疑有更好的方法)。
這裡我是手動調整了管線,平面的透明度到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()
讀者對照管線圖自行比較,這裡不多說管線,後面再說,一層一層剝洋蔥。 讀者可以自行修改各項屬性,這裡不在管線上繼續了。 這裡還有一個問題
- 怎麼把每一個小立方柱的高度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))