pandy bodový graf barvy se třemi body a Seaborn

hlasů
5

Tam je podivné chování při používání pandy a Seaborn vykreslit bodový graf, který má jen tři body: body nemají stejnou barvu. Problém zmizí Seaborn není načten nebo pokud existují více než tři body, nebo při vykreslování metodou rozptylu matplotlib je přímo. Viz následující příklad:

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

Položena 25/03/2015 v 08:24
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
-1

Možná budete chtít zkusit toto:

import seaborn.apionly as sns

A vidět tuto otázku pro další podrobnosti.

Odpovězeno 25/03/2015 v 08:31
zdroj uživatelem

hlasů
6

Jsem vypátral chybu. Chyba je v pandastechnicky ne seaborn, jak jsem původně myslel, i když se jedná kód pandas, seaborna matplotlib...

V roce pandas.tools.plotting.ScatterPlot._make_plotdojde k následující kód, aby si vybrat barvy, které mají být použity v bodovém diagramu

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

Ve vašem případě cse bude rovnat None, což je výchozí hodnota, a proto c_valuesbude dána plt.rcParams['patch.facecolor'].

Nyní, jako součást nastavení sebe samu, Seaborn modifikuje plt.rcParams['patch.facecolor']na (0.5725490196078431, 0.7764705882352941, 1.0)kterém je RGB tice. Pokud seabornnení použit pak hodnota je matplotlib default, který je 'b'(řetězec označující barvu „modrá“).

c_values se pak používá později skutečně vykreslit graf uvnitř ax.scatter

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

Vyvstává otázka, protože argument klíčové slovo cmůže přijmout více různých typů argumentu, že může přijmout: -

  • řetězec (jako je 'b'v původním matplotlib případě);
  • posloupnost barev specifikací (například posloupnost hodnot RGB);
  • posloupnost hodnot mapovat na aktuální mapu barev.

Tyto matplotlib dokument výslovně uvést následující, zvýraznění důl

c mohou být jeden barevný formát řetězce, nebo posloupnost barevných specifikací délky N, nebo posloupnost N čísel, které mají být mapovány na barvy s použitím CMap a normu zadaný přes kwargs (viz níže). Všimněte si, že C by neměl být jednoduchý číselný RGB nebo RGBA sekvence, protože to je k nerozeznání od pole hodnot, které mají být colormapped. c může být 2-D sady, v nichž jsou řady jsou RGB nebo RGBA, nicméně.

Co se v podstatě stává, že matplotlib vezme c_valueshodnotu (což je n-tice tří čísel) a potom mapuje ty barvy na aktuální barevnou mapu (který je stanoven pand bude Greysve výchozím nastavení). Jako takový, dostanete tři rozptylu body s různou „greyishness“ . Máte-li více než 3 bodový body, matplotlib předpokládá, že to musí být RGB n-tice, protože délka neodpovídá délku datových polí (3! = 4), a tak jej používá jako konstantní barvu RBG.

To bylo psáno jako hlášení o chybě na pand GitHub zde .

Odpovězeno 25/03/2015 v 09:14
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more