2016-09-28 89 views
0

的Python 2.7,matplotlib 1.5.1,WIN 7,64Matplotlib三維散自動縮放問題

我想在繪製&其幾何最近鄰(即不其最近相連的鄰居)的節點之間的最短距離使用Dijkstra算法的圖。

該算法運行良好,但當涉及繪圖時,當繪製某些節點時,matplotlib的縮放會嚇倒。

代碼片段:

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 

# Find the paths between a given node & its nearest neighbours 

def plotPath(pathStart, pathEnd, pointCol='b'): 

    shortPath = graph.dijkstra(pathStart, pathEnd) # this calculates the shortest path 

    pathNodesIdx = [i-1 for i in shortPath] # Algorithm returns 1 indexed whilst Python uses 0 indexed 
    pathCoords = L3.nodes[pathNodesIdx, 1:4] # retrieves the coordinate for the nodes on the path 

    ax.scatter(pathCoords[1:-1,0], pathCoords[1:-1,1], pathCoords[1:-1,2], s=240, c=pointCol, marker='o') 
    startNode = pathCoords[0] 
    endNode = pathCoords[-1] 
    ax.scatter(startNode[0], startNode[1], startNode[2], s=240, c='g', marker='o') 
    ax.scatter(endNode[0], endNode[1], endNode[2], s=240, c='r', marker='o') 
    for node in pathCoords[1:]: 
     ax.plot([startNode[0], node[0]], [startNode[1], node[1]], [startNode[2], node[2]], color=pointCol, linewidth=2.0) 
     startNode = node 

    return pathCoords 


pointCol = 'b' 
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 

pathStart = 1 # given node 
graph=Graph(L3.trabGraph) # L3.trabGraph is list conataining the edge/node/cost information for the graph 

# Return indices for nearest neighbours 
nearest = [i+1 for i in L3.nodeNeighbours(pathStart, numNeighs=6, method='brute')[1:]] 

比如我剛剛繪製使用plotPath(1, nearest[2])第二近鄰的路徑獲得:

enter image description here

但是如果我添加使用其他最近的鄰居,

p0 = plotPath(1, nearest[0]) 
p1 = plotPath(1, nearest[1]) 
p2 = plotPath(1, nearest[2]) 
p3 = plotPath(1, nearest[3]) 
p4 = plotPath(1, nearest[4]) 

我得到:

enter image description here

僅供參考每個個案的節點的座標:

p0 = array([[ 1.094, 1.76 , 1.125], 
     [ 1.188, 1.75 , 1.104]]) 

p1 = array([[ 1.094, 1.76 , 1.125], 
     [ 1.104, 1.875, 1.094]]) 

p2 = array([[ 1.094, 1.76 , 1.125], 
     [ 1.188, 1.75 , 1.104], 
     [ 1.188, 1.688, 1.094]]) 

p3 = array([[ 1.094, 1.76 , 1.125], 
     [ 1.198, 1.76 , 1.198]]) 

p4 = array([[ 1.094, 1.76 , 1.125], 
     [ 1.198, 1.76 , 1.198], 
     [ 1.188, 1.708, 1.198]]) 

對於我的生活我不明白爲什麼matplotlib做到這一點?有人知道嗎?

我已經遺漏了Dijkstra算法的實現(來自Rosetta代碼FYI)&爲了簡潔起見創建圖表&我無權共享圖表信息。

+0

你能告訴我們matplotlib做什麼,你不喜歡/期望在這裏以及你會如何看待結果?不知道你想達到什麼目標,沒有人能幫助你。也許[這](http://stackoverflow.com/help/how-to-ask)有幫助。 – ImportanceOfBeingErnest

+0

帖子中的2張圖片包含相同的數據。在第一張圖片中,您可以看到圖形已自動縮放以適合畫布的大小。在第二幅圖像中,圖形中增加了7個點,但自動縮放增加了畫布的大小,以至於現在所有點都聚集在角落。從帖子末尾的點列表可以看出,所有點只佔用新自動縮放畫布的非常小的一部分。 – DrBwts

+0

是的,的確如此。但究竟是什麼問題? – ImportanceOfBeingErnest

回答

1

如果這裏的問題確實是「如何設置matplotlib中3d圖的極限?」那麼答案將是:

就像你在2D情況下,這樣做:

ax.set_xlim([xmin, xmax]) 
ax.set_ylim([ymin, ymax]) 
ax.set_zlim([zmin, zmax]) 

尋找最小和最大的值對應的情況下,當然可以實現自動化。