Domanda i piccoli segni di grafico a dispersione in matplotlib sono sempre neri


Sto cercando di usare matplotlib per creare un grafico a dispersione con punti grigi molto piccoli. A causa della densità dei punti, i punti devono essere piccoli. Il problema è che i marcatori della funzione scatter () sembrano avere sia una linea che un riempimento. Quando i marcatori sono piccoli, solo la linea è visibile, non il riempimento, e la linea non è il colore giusto (è sempre nero).

Posso ottenere esattamente quello che voglio usando gnuplot: traccia 'nodi' con punti pt 0 lc rgb 'grigio'

Come posso creare punti grigi molto piccoli usando il diagramma di dispersione matplotlib ()?


53
2018-06-28 07:46


origine


risposte:


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

Ciò imposta il markersize su 1 (s = 1), il facecolor su gray (facecolor = '0.5') e la larghezza di riga su 0 (lw = 0).


67
2018-06-28 12:00



Se il marcatore non ha una faccia (non può essere riempito, ad es. '+','x'), poi il edgecolor deve essere impostato al posto di c, e lw non dovrebbe essere 0:

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

Quanto segue non funzionerà

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

perché il bordo / linea non verrà visualizzato, quindi non verrà visualizzato nulla.


30
2017-10-24 09:30



La risposta più semplice alla tua domanda è: usa il color parametro invece del c parametro per impostare il colore dell'intero marcatore.

È facile vedere la differenza quando si confrontano i risultati:

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

Dettagli: Per il tuo caso di uso semplice, in cui vuoi semplicemente rendere l'intero pennarello della stessa tonalità di grigio, non dovresti preoccuparti di cose come il colore del viso o il colore del bordo e se il tuo marcatore è definito come tutti i bordi o alcuni bordi e alcuni riempiono. Invece, basta usare il color parametro e sapere che il tuo intero marcatore sarà impostato sul singolo colore che hai specificato!


3
2017-10-21 18:59



In risposta alla domanda di zwol in commento - la mia reputazione non è abbastanza alta per lasciare commenti, quindi questo dovrà fare: Nel caso in cui i colori provengano da una mappa di colori (cioè, provengono da una "sequenza di valori da mappare") Puoi usare color = come dimostrato nel seguito:

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()

1
2017-12-30 01:21