2017-04-02 4 views
-2

Ich habe eine df:Pandas Pyplot mehrere Marker, die gleiche Linie

time c_1 c_2 c_3 
t1  v1 NaN t1 
t2  v2 NaN NaN 
t3  v3 t3  NaN 
t4  v4 NaN NaN 
t5  v5 t5  NaN 
t6  v6 NaN t6 

Wie beurteilen Sie:

  1. Verwenden matplotlib.pyplot eine Linie zu zeichnen (t1, c_1)
  2. und Marken jeder entsprechende Punkt in (c_2) auf der Linie in einem bestimmten Stil (z. B. grün)
  3. Und markieren Sie auch jeden Punkt in (c_3) auf der gleichen Linie in einem anderen Stil (z. B. blau)
  4. Dann eine gestrichelte Linie zeichnen die Marker (T1, T3), t3, t6) und (T5, T6)

Ich brach die Fragen nach unten in Punkte zu verbinden, so dass es leichter zu lesen ist, aber im Wesentlichen I bin sehr neu in pyplot, und ich finde keine Möglichkeit, 2 verschiedene Marker in der gleichen Syntax zu stylen. Ich bin auch nicht sehr sicher, wie man die Marker manipuliert, wenn das überhaupt möglich ist.

Was ist der "übliche" Weg, dies zu erreichen?

+0

@splinter, viele Fragen scheint Ihnen auf Stackoverflow unklar. Es sollte klar sein, dass ** t1 in der Spalte Time eine Zeit darstellt (d. H. Datetime, nicht string) ** und 'plt.plot (df ['c_1'])' 'eine gültige Operation ist, die Werte gegen die Zeit darstellt. Wenn nicht, wäre ein konstruktiver Vorschlag zur Durchführung von 'df.reset_index()' hilfreich. – Yeile

Antwort

1

Angenommen, Sie diesen Datenrahmen hat:

 c_1 c_2 c_3 time 
0 0.548814 NaN 1.0  1 
1 0.715189 NaN NaN  2 
2 0.602763 3.0 NaN  3 
3 0.544883 NaN NaN  4 
4 0.423655 5.0 NaN  5 
5 0.645894 NaN 6.0  6 

Wenn die folgende Handlung ist, was Sie nach

enter image description here

kann es mit dem folgenden Code erzeugt werden:

import pandas as pd 
import matplotlib.pyplot as plt 
import numpy as np; np.random.seed(0) 

time = np.arange(1,7) 
c_1 = np.random.rand(6) 
c_2 = time*np.array([np.nan, np.nan, 1, np.nan, 1, np.nan]) 
c_3 = time*np.array([1, np.nan, np.nan, np.nan, np.nan, 1]) 

df = pd.DataFrame({"time":time, "c_1":c_1,"c_2":c_2,"c_3":c_3 }) 

ax = df.plot("time", "c_1") 
ax.plot(df["c_2"], df["c_1"], marker="s", color="limegreen", linestyle="") 
ax.plot(df["c_3"], df["c_1"], marker="o", color="crimson", linestyle="") 

# to be able to draw a line with coordinates 
# from two different columns, we need to join them 
df2 = df[["c_1","c_2"]].dropna() 
df3 = df[["c_1","c_3"]].dropna().rename(columns = {'c_3':'c_2'}, inplace = False) 
df4 = pd.concat([df2, df3]).sort_values(by=["c_2"]) 

ax.plot(df4["c_2"], df4["c_1"], color="burlywood", linestyle=":", lw=2.5) 

ax.set_xlim(0,7) 
plt.show() 
+0

Gibt es einen Grund, den df-Index von einem Datetime-Index zurückzusetzen? Wenn ich die Datetime auf dem Plot anzeigen möchte, habe ich Recht, um (Zeit, Wert) zu plotten und einen gültigen (Zeit, Wert) Koordinatenmarker zu übergeben, und es würde das gleiche Ergebnis wie oben erreichen? – Yeile

+0

Ich habe von nichts anderem etwas zurückgesetzt. Da Sie keinen tatsächlichen Datenrahmen geteilt haben, musste ich einen erfinden. – ImportanceOfBeingErnest

+0

Oh okay. Ich verstehe die Technik jetzt. Danke für das Teilen! – Yeile

Verwandte Themen