2015-03-25 10 views
5

Es gibt ein seltsames Verhalten, wenn Pandas und Seaborn ein Streudiagramm zeichnen, das nur drei Punkte hat: die Punkte haben nicht die gleiche Farbe. Das Problem verschwindet, wenn Seabord nicht geladen ist oder wenn es mehr als drei Punkte gibt, oder wenn das Zeichnen mit der Streuungsmethode von matplotlib direkt erfolgt. Siehe das folgende Beispiel:Pandas Streudiagramm Farben mit drei Punkten und Seaborn

from pandas import DataFrame #0.16.0 
import matplotlib.pyplot as plt #1.4.3 
import seaborn as sns #0.5.1 
import numpy as np #1.9.2 

df = DataFrame({'x': np.random.uniform(0, 1, 3), 'y': np.random.uniform(0, 1, 3)}) 
df.plot(kind = 'scatter', x = 'x', y = 'y') 
plt.show() 

df = DataFrame({'x': np.random.uniform(0, 1, 4), 'y': np.random.uniform(0, 1, 4)}) 
df.plot(kind = 'scatter', x = 'x', y = 'y') 
plt.show() 

Antwort

6

Ich habe den Fehler aufgespürt. Der Fehler ist in pandas technisch, nicht seaborn als ich ursprünglich dachte, wenn es Code aus pandas beinhaltet, seaborn und matplotlib ...

In pandas.tools.plotting.ScatterPlot._make_plot der folgenden Code, um die Farben zu wählen, tritt in dem Streudiagramm verwendet werden

if c is None: 
    c_values = self.plt.rcParams['patch.facecolor'] 
elif c_is_column: 
    c_values = self.data[c].values 
else: 
    c_values = c 

In Ihrem Fall c wird None, gleich sein, die den Standardwert ist, und so wird c_values von plt.rcParams['patch.facecolor'] gegeben werden.

Jetzt, als Teil der Einrichtung, modifiziert Seaborn plt.rcParams['patch.facecolor'] zu (0.5725490196078431, 0.7764705882352941, 1.0), die ein RGB-Tupel ist. Wenn seaborn nicht verwendet wird, ist der Wert der Standardwert matplotlib, der 'b' ist (eine Zeichenfolge, die die Farbe "blau" angibt).

c_values wird dann innerhalb später tatsächlich zeichnen Sie die Grafik verwendet ax.scatter

scatter = ax.scatter(data[x].values, data[y].values, c=c_values, 
        label=label, cmap=cmap, **self.kwds) 

Das Problem entsteht, weil die Schlüsselwort-Argument c mehrere verschiedene Arten von Argumenten annehmen kann, kann es annehmen: -

  • eine Zeichenfolge (wie 'b' im ursprünglichen Matplotlib-Fall);
  • eine Sequenz von Farbspezifikationen (sagen wir eine Folge von RGB-Werten);
  • eine Folge von Werten, die auf die aktuelle Farbkarte abgebildet werden.

Die matplotlib docs Einzelnes das Folgende angeben, Minen

c Hervorhebung kann ein einzelnes Farbformat Zeichenfolge oder eine Sequenz von Farbspezifikationen der Länge N, oder eine Folge von N Zahlen zugeordnet werden zu Farben mit der Cmap und Norm über Kwargs (siehe unten). Beachten Sie, dass c keine einzelne numerische RGB- oder RGBA-Sequenz sein sollte, da dies nicht von einem Array von Werten unterschieden werden kann, die farbzugewandt werden sollen. c kann ein 2-D-Array sein, in dem die Zeilen jedoch RGB oder RGBA sind.

Was im Grunde passiert ist, dass matplotlib nimmt den c_values Wert (das ist ein Tupel von drei Zahlen ist) und bildet dann die Farben auf den aktuellen colormap (die durch Pandas gesetzt Greys standardmäßig zu sein). Als solche erhalten Sie drei Streupunkte mit unterschiedlichen "Graustufen". Wenn Sie mehr als 3 Streupunkte haben, geht matplotlib davon aus, dass es sich um ein RGB-Tupel handeln muss, da die Länge nicht mit der Länge der Datenfelder übereinstimmt (3! = 4) und so als konstante RBG-Farbe verwendet wird.

Dies wurde als Fehlerbericht über die Pandas Github here geschrieben.

+0

Vielen Dank. Werden Sie einen Bugreport auf GitHub veröffentlichen und eine PR einreichen? Ich könnte es versuchen, wenn du es bevorzugst. –

+0

@DavidBrochart ah Entschuldigung vergessen zu erwähnen. Ich habe einen Fehlerbericht über die Pandas GitHub [hier] (https://github.com/pydata/pandas/issues/9724) gepostet. Werde sehen, was die Leute sagen, bevor sie fortfahren. – Ffisegydd

+0

Schöne Detektivarbeit, @Ffisegydd – mwaskom

-1

Vielleicht möchten Sie dies versuchen:

import seaborn.apionly as sns 

Und siehe This question für weitere Details.

+0

Während dies ein nützliches Stück Info ist, beantwortet es nicht die Frage, wie das Problem behoben werden kann. Was, wenn du * die Seebohnenfarbe benutzen willst? – Ffisegydd

Verwandte Themen