2014-07-03 49 views
0

可能在matplotlib中繪製一個Go-Board? 只要你不要求他們,我不會向你展示我可怕的嘗試(它包括一些與補丁一起工作),我希望你能想出更好的想法。用Matplotlib繪製一個Go-Board

甚至更​​好:有一個圖書館爲此,或有人已經編程它? 那會很好! (爲什麼有人需要matplotlib中的GO Board?這裏有很多原因,我的AI和python/C++一起工作,以及一些可視化的性能,這在matplotlib中繪製,現在可以導出/ import to .sgf,但是這包括一個外部查看器,如果需要很多地塊,它會很慢。)

+0

也許,但我認爲Pygame會更好(或只是繪製ASCII藝術風格)。 – rlms

回答

5

當然。什麼都可以得出,它僅僅是一個所需的代碼量的事......

import matplotlib.pyplot as plt 

# create a 8" x 8" board 
fig = plt.figure(figsize=[8,8]) 
fig.patch.set_facecolor((1,1,.8)) 

ax = fig.add_subplot(111) 

# draw the grid 
for x in range(19): 
    ax.plot([x, x], [0,18], 'k') 
for y in range(19): 
    ax.plot([0, 18], [y,y], 'k') 

# scale the axis area to fill the whole figure 
ax.set_position([0,0,1,1]) 

# get rid of axes and everything (the figure background will show through) 
ax.set_axis_off() 

# scale the plot area conveniently (the board is in 0,0..18,18) 
ax.set_xlim(-1,19) 
ax.set_ylim(-1,19) 

# draw Go stones at (10,10) and (13,16) 
s1, = ax.plot(10,10,'o',markersize=30, markeredgecolor=(0,0,0), markerfacecolor='w', markeredgewidth=2) 
s2, = ax.plot(13,16,'o',markersize=30, markeredgecolor=(.5,.5,.5), markerfacecolor='k', markeredgewidth=2) 

給出了這樣的:

enter image description here

如果你不喜歡的背景,你甚至可以放在那裏使用imshow拍攝的棋盤或任何您需要的照片。

一件好事就是如果你拿出由ax.plot返回的對象,你可以刪除它們並重新繪製板子而不需要做很多工作。

ax.lines.remove(s1) 

或者乾脆

s1.remove() 

第一個顯示是怎麼回事;線對象從線列表中刪除,第二個類型鍵入更快,因爲線對象知道它的父項。

其中之一,它已經消失。 (您可能需要調用draw看到的變化。)


有很多方法可以做到的事情在Python和matplotlib也不例外。根據tcaswell的建議,線條被網格替換,圓形標記帶有圓形補丁。此外,現在從原型創建黑白寶石。

import matplotlib.pyplot as plt 
import matplotlib.patches as mpatches 
import copy 

fig = plt.figure(figsize=[8,8], facecolor=(1,1,.8)) 
ax = fig.add_subplot(111, xticks=range(19), yticks=range(19), axis_bgcolor='none', position=[.1,.1,.8,.8]) 
ax.grid(color='k', linestyle='-', linewidth=1) 
ax.xaxis.set_tick_params(bottom='off', top='off', labelbottom='off') 
ax.yaxis.set_tick_params(left='off', right='off', labelleft='off') 

black_stone = mpatches.Circle((0,0), .45, facecolor='k', edgecolor=(.8,.8,.8, 1), linewidth = 2, clip_on=False, zorder=10) 
white_stone = copy.copy(black_stone) 
white_stone.set_facecolor((.9, .9, .9)) 
white_stone.set_edgecolor((.5, .5, .5)) 

s1 = copy.copy(black_stone) 
s1.center = (18,18) 
ax.add_patch(s1) 

s2 = copy.copy(white_stone) 
s2.center = (6,10) 
ax.add_patch(s2) 

結果基本相同。

+0

它更簡單,'s1.remove()'會做正確的事情。我也會使用'ax_hline'和'ax_vilne'來代替繪圖,或者只使用網格系統。我也會用圓圈補丁來代替繪圖,所以你可以用一種比較清晰的方式控制尺寸 – tacaswell

+0

@tcaswell:謝謝你的評論!我同意你的看法,但我只是試着製作一些代碼,它使用了'matplotlib'這樣一些不太知名的功能。我會嘗試將您的建議以某種方式整合到我的答案中。 (我實際上想過使用網格,如果不是角落和邊緣,它會是一個非常簡單的解決方案。) – DrV

+0

如果您關閉藝術家的裁剪,只需使用軸框架作爲外邊緣 – tacaswell