2017-05-03 2 views
0

Ich habe ein Balkendiagramm mit mehreren Datenreihen und ich möchte die Xaxis Werte auf einen signifikanten Wert von% .2f Ich habe bereits versucht mit dem Set_major Formatierer für den ersten Graphen , aber es setzt die Werte auf 0 zurück, während die Werte wie der zweite Graph sein sollten.Einstellung xaxis Werte zu% .2f auf einem Balkendiagramm

Wie kann ich das beheben?

This bar graph

Mein Code sieht wie folgt aus:

import matplotlib.pyplot as plt 
import pandas as pd 
import matplotlib.ticker as mtick 

# select the measurement location 
MATH = "import/data/place" 
SAVE = "save/location" 

fig, axes = plt.subplots(figsize=(12,15),nrows=2, ncols=1) # size of the plots and the placing 
fig.subplots_adjust(hspace=0.5) # set space between plots 

DATA = pd.read_csv(MATH,delimiter=',',usecols = [2,3,4,5,6,7,8,9,10,11,12],names = ['set_t','set_rh', 
        'type','math','ref','LUFFT','VPL','VPR','VVL','VVR','PRO'], parse_dates=True) 
# select the data 
temp = DATA.loc[(DATA['type']=='T')&(DATA['math']=='dif')] # dif temperature data 
rh = DATA.loc[((DATA['type']=='RH')&(DATA['math']=='dif'))] # dif relative humidity data 

# plot temperature 
fg = temp.plot.bar(x='set_t',y = ['LUFFT','VPL','VPR','VVL','VVR','PRO'], 
        color = ['b','firebrick','orange','forestgreen','darkturquoise','indigo'], 
        ax=axes[0]) 

fg.grid(True) 
fg.set_ylabel('$ΔT$(°C)',fontsize = 12) 
fg.set_xlabel('ref $T$ (°C)',fontsize = 12) 
fg.set_title('Difference in T from reference at constant relative humidity 50%',fontsize = 15) 
fg.yaxis.set_major_formatter(mtick.FormatStrFormatter('%.2f')) 
fg.xaxis.set_major_formatter(mtick.FormatStrFormatter('%.2f')) 

# plot relative humidity 
df = rh.plot.bar(x='set_t',y = ['LUFFT','VPL','VPR','VVL','VVR','PRO'], 
        color = ['b','firebrick','orange','forestgreen','darkturquoise','indigo'], 
        ax=axes[1]) 
df.grid(True) 
df.set_ylabel('$ΔU$(%)',fontsize = 12) 
df.set_xlabel('ref $T$ (°C)',fontsize = 12) 
df.set_title('Difference in U from reference at constant relative humidity 50%',fontsize = 15) 

plt.tight_layout() 
plt.savefig(SAVE + "_example.jpg") 
plt.show() 

Eine Probe meiner Daten:

07: 40: 00,07: 50: 00,39.85716354999982,51.00504745588235, T, dif ,, 0,14283645000018197, -0,07502069285698099, -0,15716354999978677,0,00202, -0,07111703837193772, -0,0620802166664447,

07: 40: 00,07: 50: 00,39.85716354999982,51.00504745588235, RH, dif ,, - 0.40504745588239643,3.994952544117652,2.994952544117652,4.994952544117652, 6,994952544117652,

08: 40: 00,08: 50: 00, 34.861160704969016,51.1297401832298, T, dif ,, 0.22883929503095857,0.2509082605481865, -0.2575243413326831,0.24864321659958222,0.14092262836431502, -0,04441070496899613,

08: 40: 00,08: 50: 00,34.861160704969016,51.1297401832298, RH, dif ,, - ,32974018322978793 , 3.8702598167702007,2.8702598167702007,4.870259816770201, 6,870259816770201,

+0

Sie können die Frage bearbeiten, um eine kleine Auswahl von Werten aus Ihrer CSV-Datei hinzuzufügen. Dies würde die Reproduktion Ihres Problems erleichtern. –

+0

Ich habe es zu der Frage hinzugefügt – Sanne

Antwort

2

Dies ist aufgrund der Tatsache, dass mit einer gruppierten BarPlot wie t seine von Pandas gemachte X-Achse verliert ihre tatsächliche 'Reichweite', und die Werte, die mit der Zeckenposition verbunden sind, werden zur Position selbst. Das ist ein bisschen kryptisch, aber Sie können mit fg.get_xlim() sehen, dass die Werte "Berührung" mit den ursprünglichen Daten verloren haben und einfach ganze Zahlen erhöhen. Sie können/debug erkunden die ‚Werte‘ und ‚Positionen‘ Matplotlib verwendet, wenn Sie eine FuncFormatter mit einer Funktion wie folgt liefern:

def check_pos(val, pos):  
    print(val, pos)  
    return '%.2f' % val 

Dies zeigt im Grunde, dass kein Formatierer für Ihren Fall funktionieren wird.

Zum Glück sind die ticklabels richtig eingestellt (als Text), so dass Sie diese zu floaten analysieren und formatieren können, wie Sie es wünschen.

Entfernen Sie Formatierer zusammen, und stellen Sie die xticklabels mit:

fg.set_xticklabels(['%.2f' % float(x.get_text()) for x in fg.get_xticklabels()]) 

Beachten Sie, dass Matplotlib sich durchaus in der Lage ist, die richtige tickvalues in Kombination mit einem Balkendiagramm zu erhalten, aber Sie würden die ‚Gruppierung zu tun haben, 'etc selbst, das ist auch nicht sehr bequem.

+0

Danke das funktioniert! – Sanne

Verwandte Themen