2013-01-06 26 views
18

Chcę wykreślić wiele linii z pandasowej ramki danych i ustawić różne opcje dla każdej linii. Chciałbym zrobić coś takiegoPandy Pythona, opcje drukowania dla wielu linii

testdataframe=pd.DataFrame(np.arange(12).reshape(4,3)) 
testdataframe.plot(style=['s-','o-','^-'],color=['b','r','y'],linewidth=[2,1,1]) 

Zwiększy to jakieś komunikaty o błędach:

  • linewidth nie jest wymagalne z listą

  • W stylu nie mogę użyć „S” i "o" lub jakikolwiek inny symbol alfabetyczny, definiując kolory na liście

Istnieje również kilka rzeczy, które wydaje się dziwne dla mnie

  • kiedy dodać kolejne polecenie wydruku do powyższego kodu testdataframe[0].plot() będzie wykreślić ten wiersz w tej samej działce, jeśli dodać polecenie testdataframe[[0,1]].plot() stworzy nową działkę

  • Jeśli ja nazwałbym testdataframe[0].plot(style=['s-','o-','^-'],color=['b','r','y']) to jest w porządku z listy w stylu, ale nie z listy w kolorze

nadzieję, że ktoś może pomóc, dzięki.

Odpowiedz

32

Jesteście tak blisko!

Można określić kolory na liście stylów:

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

testdataframe = pd.DataFrame(np.arange(12).reshape(4,3), columns=['A', 'B', 'C']) 
styles = ['bs-','ro-','y^-'] 
linewidths = [2, 1, 4] 
fig, ax = plt.subplots() 
for col, style, lw in zip(testdataframe.columns, styles, linewidths): 
    testdataframe[col].plot(style=style, lw=lw, ax=ax) 

Należy również pamiętać, że metoda plot może zająć matplotlib.axes obiektu, dzięki czemu można tworzyć wiele połączeń tak (jeśli chcesz):

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

testdataframe1 = pd.DataFrame(np.arange(12).reshape(4,3), columns=['A', 'B', 'C']) 
testdataframe2 = pd.DataFrame(np.random.normal(size=(4,3)), columns=['D', 'E', 'F']) 
styles1 = ['bs-','ro-','y^-'] 
styles2 = ['rs-','go-','b^-'] 
fig, ax = plt.subplots() 
testdataframe1.plot(style=styles1, ax=ax) 
testdataframe2.plot(style=styles2, ax=ax) 

Niezbyt praktyczne w tym przypadku, ale koncepcja może się przydać później.

+1

thx za pomoc, ale to nie pomaga przy szerokości linii? również chcę użyć niektórych samodzielnie zdefiniowany kolor, takich jak own_color = "# FF0000", a następnie nie jest możliwe wywołanie w ten sposób. – Joerg

+0

następnie mogę myśleć tylko iteracji przez kolumny. zobacz moje zmiany do pierwszego przykładu. –

+3

Tak, właśnie tego używam teraz. Ale zastanawiam się, czy to tylko niezręczny sposób na tak proste zadanie. Ale wielkie dzięki za pomoc !! – Joerg

6

rozważywszy dataframe testdataframe

testdataframe = pd.DataFrame(np.arange(12).reshape(4,3)) 

print(testdataframe) 

    0 1 2 
0 0 1 2 
1 3 4 5 
2 6 7 8 
3 9 10 11 

Można łączyć styles w jednym liście strun jak w styles określonym poniżej. Ja też zdefiniować linewidths w lws

styles=['bs-', 'ro-', 'y^-'] 
lws = [2, 1, 1] 

Możemy użyć metody plot na testdataframe przekazując listę styles do parametru style. Zauważ, że mogliśmy również przekazać słownik (i prawdopodobnie także inne rzeczy).

Jednak szerokości linii nie są tak łatwe w obsłudze. Najpierw przechwytywam obiekt AxesSubplot i powtarzam nad atrybutem linii ustawiając szerokość linii.

ax = testdataframe.plot(style=styles) 
for i, l in enumerate(ax.lines): 
    plt.setp(l, linewidth=lws[i]) 

enter image description here

3

Więc myślę, że odpowiedź leży w przejściu kolor i styl w tym samym argumentem. Poniższy przykład działa z pandami 0.19.2:

testdataframe=pd.DataFrame(np.arange(12).reshape(4,3)) 
testdataframe.plot(style=['r*-','bo-','y^-'], linewidth=2.0) 

Niestety, wydaje się, że przekazywanie wielu szerokości linii jako dane wejściowe do matplotlib nie jest możliwe.

Powiązane problemy