2011-06-28 74 views
53

我正在嘗試使用matplotlib製作一個散點圖,其中包含非常小的灰點。由於點密度,點數需要很小。問題是scatter()函數的標記似乎既有行又有填充。當標記很小時,只有線是可見的,而不是填充,並且線不是正確的顏色(它總是黑色的)。matplotlib中的小散點圖標記始終爲黑色

我可以得到正是我想要使用什麼gnuplot的:陰謀「節點」與點數PT 0 LC RGB「灰色」

我怎樣才能讓使用matplotlib散點圖非常小灰點()?

回答

64
scatter([1,2,3], [2,4,5], s=1, facecolor='0.5', lw = 0) 

這設置markersize爲1(S = 1),則facecolor爲灰色(facecolor = '0.5'),以及線寬爲0(LW = 0)。

+6

這工作,但它更普遍設置'edgecolor'爲'‘’'的原因,對方的回答中提到。 – kwinkunks

+2

實際上,在較新版本的Matplotlib中(與在2011年當問題被問到時的版本相反),您可以使用關鍵字'color'來同時設置edgecolor和facecolor。然而,該功能沒有記錄,建議進行折舊,並與「繪圖」行爲發生衝突,其中「顏色」僅設置linecolor和fillcolor,而不設置edgecolor。 – Daan

29

如果標記沒有面子(不能填充,例如'+''x'),那麼edgecolor必須被替代設置的c,並lw不應該0

scatter([1,2,3], [2,4,5], marker='+', edgecolor='r') 

以下將不工作

scatter([1,2,3], [2,4,5], s=1, marker='+', facecolor='0.5', lw = 0) 

因爲邊緣/線條不會顯示,所以什麼都不會顯示。

+1

有用瞭解。 Doc不包括這一點。 – smci

+0

着色邊緣是比沒有顯示更好的解決方案。很難找到,因爲matplotlib文檔提到錯誤的「markeredgecolor」而不是正確的「edgecolor」 – user989762

+0

從pandas DataFrame調用'plot.scatter'時,截至2017年12月,'markeredgecolor'和'edgecolor'都不是有效的參數。 – bli

3

對於您的問題,絕對最簡單的答案是:使用參數color而不是參數c來設置整個標記的顏色。

很容易看出差別,當你比較的結果:

from matplotlib import pyplot as plt 

plt.scatter([1,2,3], [3,1,2], c='0.8') # marker not all gray 

plt.scatter([1,2,3], [3,1,2], color='0.8') # marker all gray 

詳情: 爲您簡單的例子,你只是想使你的整個標誌是灰顏色的色光不變,你真的不應該擔心諸如臉部顏色和邊緣顏色之類的東西,以及你的標記是被定義爲所有邊緣還是某些邊緣和一些填充。相反,只需使用color參數,並知道您的整個標記將被設置爲您指定的單一顏色!

+0

當顏色是「要映射的值序列」(即,不是固定參數,而是您正在繪製的變量之一)時,這不起作用。您會收到一條錯誤消息,告訴您非常明確地使用'c ='來代替。當顏色是一個變量時,你知道如何得到'color ='的效果嗎? – zwol

1

爲了迴應zwol的評論問題 - 我的聲望不夠高,不足以留下評論,所以必須這樣做:如果您的顏色來自顏色映射(即,是從一系列值到映射「),可以使用color =,如下所示:

from matplotlib import pyplot 

x = [1,5,8,9,5] 
y = [4,2,4,7,9] 
numSides = [2,3,1,1,5] 

cmap = pyplot.cm.get_cmap("copper_r") 

min, max = min(numSides), max(numSides) 
for i in range(len(x)): 
    if numSides[i] >= 2: 
     cax = pyplot.scatter(x[i], y[i], marker = '+', s = 100, c = numSides[i], cmap = cmap) 
     cax.set_clim(min, max) 
    elif numSides[i] == 1: 
     pyplot.scatter(x[i], y[i], marker = '.', s = 40, color = cmap(numSides[i])) 

fig = pyplot.gcf() 
fig.set_size_inches(8.4, 6) 
fig.savefig('figure_test.png', dpi = 200) 
pyplot.show()