2015-05-27 74 views
2

我有一個由Networkx創建的無向圖,我使用pyplot顯示,我想讓用戶指定網格線之間的間距。我不想手動輸入刻度,因爲這需要知道繪圖的最終大小(如果有一種方法可以做到這一點,我想知道),這可能會根據顯示的圖形而有所不同。PyPlot - 爲陰謀設置網格線間距

有沒有什麼方法可以讓你設置間隔量?我查了一會兒,找不到任何東西,謝謝。

下面的代碼涉及創建的情節,而不是圖形。

#Spacing between each line 
intervals = float(sys.argv[1]) 

nx.draw(displayGraph, pos, node_size = 10) 
plt.axis('on') 
plt.grid('on') 
plt.savefig("test1.png") 

我需要找到一種方法來讓網格具有由用戶定義的間隔間隔。我已經找到了一些方法來做到這一點,但它還依賴於說明你需要多少個網格線,並且導致線條不會均勻地分佈在劇情上

+0

你能分享一些你的代碼嗎? –

+0

當然會立即編輯 – HFulcher

回答

7

不知道這是否違反我們您不希望手動蜱玩,但您可以使用matplotlib.ticker將滴答設置爲您的給定時間間隔:

import matplotlib.pyplot as plt 
import matplotlib.ticker as plticker 

fig,ax=plt.subplots() 

#Spacing between each line 
intervals = float(sys.argv[1]) 

loc = plticker.MultipleLocator(base=intervals) 
ax.xaxis.set_major_locator(loc) 
ax.yaxis.set_major_locator(loc) 

# Add the grid 
ax.grid(which='major', axis='both', linestyle='-') 
+0

這個完美的作品!如果我可以刪除軸標籤(例如行號),那麼我的理想是什麼,所以我只有線條,有什麼建議? – HFulcher

+0

'ax.set_xticklabels([])'和'ax.set_yticklabels([])''如何? – tom

+0

工程,但仍有一些惱人的[空白](http://i.imgur.com/SWotEO7.jpg)。只是使用plt.grid('on')給了我[this](http://i.imgur.com/fMVFNyR.jpg)這是更合乎需要的(顯然具有正確的網格間距),這不是一個交易斷路器要好好避免:) – HFulcher

0

例如,您可以使用xlim來獲取x-軸和用戶指定的時間間隔,你應該可以使用ax.axvline自己繪製網格,如本例中https://stackoverflow.com/a/9128244/566035

希望得到這個幫助。

(編輯)這裏是一個示例。

from pylab import * 

fig = figure() 
ax = fig.add_subplot(111) 

ax.plot([1,2,3, 15],[2,3,4, 25],'ro') 
xmin,xmax = xlim() 
user_interval = 1.5 
for _x in np.arange(xmin, xmax, user_interval): 
    ax.axvline(x=_x, ls='-') 
draw() 
+0

位混淆鏈接中的代碼如何允許用戶指定的時間間隔?你能爲我澄清嗎?謝謝 – HFulcher

8

您可以使用ticker設置tick locations網格。用戶可以指定MultipleLocator的輸入,它將「在視圖間隔中每個基數的整數倍上設置一個記號」。這裏有一個例子:

from matplotlib import pyplot as plt 
from matplotlib.ticker import MultipleLocator 
import numpy as np 

# Two example plots 
fig = plt.figure() 
ax1 = fig.add_subplot(2,2,1) 
ax2 = fig.add_subplot(2,2,2) 

spacing = 0.5 # This can be your user specified spacing. 
minorLocator = MultipleLocator(spacing) 
ax1.plot(9 * np.random.rand(10)) 
# Set minor tick locations. 
ax1.yaxis.set_minor_locator(minorLocator) 
ax1.xaxis.set_minor_locator(minorLocator) 
# Set grid to use minor tick locations. 
ax1.grid(which = 'minor') 

spacing = 1 
minorLocator = MultipleLocator(spacing) 
ax2.plot(9 * np.random.rand(10)) 
# Set minor tick locations. 
ax2.yaxis.set_minor_locator(minorLocator) 
ax2.xaxis.set_minor_locator(minorLocator) 
# Set grid to use minor tick locations. 
ax2.grid(which = 'minor') 

plt.show() 

Two subplots with different grids.

編輯

要使用此與Networkx一起,你可以如上和軸至通創建一個使用插曲軸(或其他功能) draw是這樣的。

nx.draw(displayGraph, pos, ax=ax1, node_size = 10) 

或者您可以撥打nx.draw正如你在你的問題做,並使用gca得到事後當前軸:

nx.draw(displayGraph, pos, node_size = 10) 
ax1 = plt.gca() 
+0

這看起來完全像我所需要的,但只有一個問題。對於add_subplot(),我的值應該如何,因爲繪圖由Networkx庫爲圖 – HFulcher

+0

處理。您可以將座標軸傳遞給nx.draw(),也可以在繪製座標軸後獲取當前座標軸。我編輯了我的答案以包含更多細節。 – Molly

+0

非常好,謝謝你的幫助,如果我有足夠的代表,請給予+1。 – HFulcher