[FIXED] pandas.DataFrame.plot zeigt Farbkarte inkonsistent

Ausgabe

Also versuche ich, ein paar Plots zu machen und habe versucht, den Cmap “Jet” zu verwenden. Es erschien immer wieder als Viridis, also habe ich mich in SE umgesehen und einige sehr einfache Plots ausprobiert:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 100)
y = x
t = x
df = pd.DataFrame([x,y]).T

df.plot(kind="scatter", x=0, y=1, c=t, cmap="jet")

Geben Sie hier die Bildbeschreibung ein

x = np.arange(0, 100.1)
y = x
t = x
df = pd.DataFrame([x,y]).T

df.plot(kind="scatter", x=0, y=1, c=t, cmap="jet")

Geben Sie hier die Bildbeschreibung ein

Irgendwelche Gedanken darüber, was hier vor sich geht? Ich kann sagen, dass es etwas mit dem dtype der Felder im Datenrahmen zu tun hat (dypte=”float” zum ersten Codesatz hinzugefügt und das gleiche Ergebnis wie im zweiten Codesatz erhalten), sehe es aber nicht warum das so wäre.

Was ich natürlich wirklich möchte, ist eine Problemumgehung, wenn mit meinem Code nichts falsch ist.

Lösung

Es scheint tatsächlich mit Pandas (Scatter) Plot zusammenzuhängen und wie Sie darauf hingewiesen haben, Float zu dtype – einige weitere Details am Ende.

Eine Problemumgehung ist die Verwendung von matplotlib.

Der Plot sieht am Ende gleich aus, aber die
cmap="jet"Einstellung gilt auch für float dtype:

Geben Sie hier die Bildbeschreibung ein

Code:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

x = np.arange(0, 100.1)
y = x
t = x
df = pd.DataFrame([x,y]).T

fig, ax = plt.subplots(1,1)

sc_plot = ax.scatter(df[0], df[1], c=t, cmap="jet")
fig.colorbar(sc_plot)

ax.set_ylabel('1')
ax.set_xlabel('0')

plt.show()

Oder die kürzere Version (etwas näher am kurzen df.plot-Aufruf) mit pyplot anstelle der objektorientierten Schnittstelle :

df = pd.DataFrame([x,y]).T

sc_plot = plt.scatter(df[0], df[1], c=t, cmap="jet")
plt.colorbar(sc_plot)
plt.ylabel('1')
plt.xlabel('0')
plt.show()

In Bezug auf die Hauptursache, warum Pandas df.plotdie cmap-Einstellung nicht befolgen:

Das nächste, was ich finden konnte, ist, dass Pandas Scatter Plot c dauert

str, int oder arrayartig

(obwohl ich nicht sicher bin, warum t sich nicht auf den Index bezieht, der wieder int wäre).

Sogar df.plot(kind="scatter", x=0, y=1, c=df.index.values.tolist(), cmap='jet')greift auf viridis zurück, während df.index.values.tolist()eindeutig nur int.

Was noch seltsamer ist, da pandasdf.plot standardmäßig auch matplotlib verwendet:

Verwendet das durch die Option plotting.backend angegebene Backend. Standardmäßig wird matplotlib verwendet.


Beantwortet von –
MagnusO_O


Antwort geprüft von –
Candace Johnson (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like