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

秉着邊學邊寫邊折騰的原則,開始粗糙的工作。真正掌握還是得講解給別人聽。
先給出網課
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. ——調整目錄和排版。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章