2014-11-18 14 views
9

Ho questo codice leggermente modificato da here:Cambiare colore e marcatore di ogni punto usando jointplot Seaborn

import seaborn as sns 
sns.set(style="darkgrid") 

tips = sns.load_dataset("tips") 
color = sns.color_palette()[5] 
g = sns.jointplot("total_bill", "tip", data=tips, kind="reg", stat_func=None, 
        xlim=(0, 60), ylim=(0, 12), color='k', size=7) 

g.set_axis_labels('total bill', 'tip', fontsize=16) 

e ho un bel terreno alla ricerca - Tuttavia, per il mio caso ho bisogno di essere in grado di cambiare la colore e formato di ogni singolo punto.

Ho provato con le parole chiave, , style e fmt, ma ottengo l'errore TypeError: jointplot() got an unexpected keyword argument.

Qual è il modo corretto per farlo? Vorrei evitare di chiamare i dati e le distribuzioni marginali manualmente

+0

Forse sto malinteso, ma secondo [questa risposta] (http://stackoverflow.com/questions/18800944/changing-marker-style-in-scatter-plot-according-to-third-variable), non è possibile passare una lista di marker a 'plt.scatter' e quindi anche l'involucro 'seaborn' non funzionerà. – cd98

+0

Sparare. Dovrò modificarlo. Forse sarebbe possibile cancellare i punti dopo che la figura è stata creata e tracciarli singolarmente. – pbreach

+0

Alla fine non è stato troppo difficile. Tutto quello che dovevo fare era 'g.ax_joint.cla()' per cancellare gli assi dove sono tracciati i punti e poi tracciare i punti usando la risposta che hai citato. La regressione è finita ma non ho davvero bisogno di quella parte comunque solo i punti con le distribuzioni marginali – pbreach

risposta

10

Risolvere questo problema non è quasi diverso da quello di matplotlib le distribuzioni marginali:

import seaborn as sns 
from itertools import product 
sns.set(style="darkgrid") 

tips = sns.load_dataset("tips") 
color = sns.color_palette()[5] 
g = sns.jointplot("total_bill", "tip", data=tips, kind="reg", stat_func=None, 
        xlim=(0, 60), ylim=(0, 12), color='k', size=7) 

#Clear the axes containing the scatter plot 
g.ax_joint.cla() 

#Generate some colors and markers 
colors = np.random.random((len(tips),3)) 
markers = ['x','o','v','^','<']*100 

#Plot each individual point separately 
for i,row in enumerate(tips.values): 
    g.ax_joint.plot(row[0], row[1], color=colors[i], marker=markers[i]) 

g.set_axis_labels('total bill', 'tip', fontsize=16) 

che mi dà questo:

enter image description here

La retta di regressione è ormai andato, ma questo è tutto quello che dovevo.

+6

'plt.scatter' non ha alcun modo per controllare il marcatore usato per i singoli punti, quindi qualcosa di simile è probabilmente il tuo migliore scommetti, ma puoi fare 'g.ax_joint.collections [0] .set_visible (False)' invece di cancellare l'intero Assi, che manterrà la linea di regressione. – mwaskom

10

La risposta accettata è troppo complicata. plt.sca() può essere usato per fare questo in un modo più semplice:

import matplotlib.pyplot as plt 
import seaborn as sns 

tips = sns.load_dataset("tips") 
g = sns.jointplot("total_bill", "tip", data=tips, kind="reg", stat_func=None, 
        xlim=(0, 60), ylim=(0, 12)) 


g.ax_joint.cla() # or g.ax_joint.collections[0].set_visible(False), as per mwaskom's comment 

# set the current axis to be the joint plot's axis 
plt.sca(g.ax_joint) 

# plt.scatter takes a 'c' keyword for color 
# you can also pass an array of floats and use the 'cmap' keyword to 
# convert them into a colormap 
plt.scatter(tips.total_bill, tips.tip, c=np.random.random((len(tips), 3))) 
+4

Suggerisco di saltare la chiamata a 'plt.sca' e di usare direttamente l'oggetto axes:' g.ax_joint.scatter (tips.total_bill, ...) '. Evita la macchina di stato 'pyplot' quando possibile. –

-1

Le altre due risposte sono stravaganze complessi (in realtà, sono da persone che veramente capire cosa sta succedendo sotto il cofano).

Ecco una risposta di qualcuno che sta solo indovinando. Funziona comunque!

tips = sns.load_dataset("tips") 
g = sns.jointplot("total_bill", "tip", data=tips, 
       c=tips.day.cat.codes, cmap='Set1', stat_func=None, 
       xlim=(0, 60), ylim=(0, 12)) 
+1

Non penso che funzioni; L'ho appena provato in Seaborn 0.7.1 e ho ottenuto l'errore ValueError: fornire un 'kwarg' c 'o un kwarg' colore 'ma non entrambi; differiscono ma le loro funzionalità si sovrappongono. Bello come sarebbe se l'argomento 'c' potesse essere una raccolta, non penso che possa farlo. – Nelson

0

Un'altra opzione è utilizzare JointGrid, poiché jointplot è un wrapper che ne semplifica l'utilizzo.

import matplotlib.pyplot as plt 
import seaborn as sns 

tips = sns.load_dataset("tips") 

g = sns.JointGrid("total_bill", "tip", data=tips) 
g = g.plot_joint(plt.scatter, c=np.random.random((len(tips), 3))) 
g = g.plot_marginals(sns.distplot, kde=True, color="k") 
1
  1. In seaborn/categorical.py, trovare def swarmplot.
  2. Add parametro marker='o' prima **kwargs
  3. In kwargs.update, aggiungi marker=marker.

Quindi aggiungere ad es. marker='x' come parametro durante la stampa con sns.swarmplot() come per Matplotlib plt.scatter().

Appena incontrato lo stesso bisogno, e avendo come kwarg non ha funzionato. Quindi ho avuto una breve occhiata. Possiamo impostare altri parametri in modi simili. https://github.com/ccneko/seaborn/blob/master/seaborn/categorical.py

Solo un piccolo cambiamento necessario qui, ma ecco la pagina di GitHub biforcuta per una rapida consultazione;)

Problemi correlati