我試圖繪製大量具有不同外觀(形狀,邊緣顏色,臉部,顏色等)的點,並發現繪製明顯方式(使用每個點使用plot
)需要很長時間。我看到了各種提高性能的方法,但發現這些方法或者降低了點外觀的靈活性,或者最終比我看起來更爲低級。什麼是Pythonic繪製大量不同外觀點的方法?
舉例來說,如果我有
fig, ax = matplotlib.pyplot.subplots()
rands = numpy.random.random_sample((n,))
其中n
是一些大的數量,然後使用plot
繪製每個點
for x in range(n):
ax.plot(x, rands[x], 'o', color=str(rands[x]), mec=str(1-rands[x]))
需要很長的時間,似乎非常低效。更快的結果可以通過一次
ax.plot(range(n), rands, 'o', color='b', mec='r')
但控制權的個別點(這裏的許多功能喪失繪製多個點來實現,例如既不color
也不mec
可以是一個列表,和許多其他方面受到相同的限制)。使用便利方法如scatter
ax.scatter(range(n), rands, marker='o', color=[str(y) for y in rands])
也產生快速結果;但同樣損失了相當大的靈活性(雖然點可以單獨着色,但不支持plot
的各個點的設置功能的剩餘選項)以及一些自動軸限制(使用set_xlim
和set_ylim
似乎是完成plot
所要做的自動)。
最後,我看到,在結合使用,如圓形圖形元素與collections許多實例,而「快常見的使用情況」,導致代碼看起來「低水平」我
patches = []
colors = []
for x in range(n):
circ = matplotlib.patches.Circle((x/float(n), rands[x]), .01)
colors.append([rands[x],rands[x],rands[x]])
patches.append(circ)
collection = matplotlib.collections.PatchCollection(patches)
collection.set_facecolor(colors)
collection.set_edgecolor([[1-h for h in c] for c in colors])
ax.add_collection(collection)
因爲不僅打破了繪圖點的抽象,而且還需要大量的縮放和調整來恢復(甚至部分地)由plot
自動提供的外觀(這裏爲了避免扭曲的「點」,例如matplotlib.pyplot.axis('equal')
是必要的)。
這是令人沮喪的,因爲plot
似乎是一種自然的使用方法,因爲它提供了各個點的所有正確定製,並且結果的圖形很好地縮放並且軸自然地有界 - 使用點時它太慢並且不接受列表作爲大多數屬性的參數。
什麼是正確的Pythonic方式來繪製大量的點,其中每個點的特徵(標記,邊緣顏色,臉部顏色,alpha,大小等)必須可能被定製?是使用圓圈(或其他形狀)和集合(隨後是縮放和其他調整圖形)真的是首選的(或至少是必要的)方法?
前面的討論http://stackoverflow.com/a/26764169/249341的後續行動,我認爲這將是有意義的自己編寫自定義的繪圖功能*一旦*已經做了你需要的東西(如變量大小等)並將其用於所有未來的項目。更多的可定製性可以向matplotlib團隊提交請求。在這個網站上有幾個活躍的開發者,也許他們會給你一些提示。 – Hooked 2014-11-06 19:12:47
@Hooked:是的。問題是,即使這樣的自定義函數是Pythonic方式。並同意:很高興看到'plot'的點樣式參數以列表作爲參數。事實上,人們似乎不得不放棄繪圖並切換到*繪圖*(如果屬實,這似乎是一個嚴重的缺點)。 – orome 2014-11-06 19:15:49