2017-01-16 4 views
2

Ich habe einige Daten generiert und versuche, sie als zwei Grafiken in der gleichen Handlung zu visualisieren. Einer als Bar, der andere als Linie.Matplotlib Graph mit den gleichen Daten überlappt nicht

Aus irgendeinem Grund scheinen sich die Graphen nicht zu überlappen.

Hier ist mein Code:

# roll two 6-sided dices 500 times 
dice_1 = pd.Series(np.random.randint(1, 7, 500)) 
dice_2 = pd.Series(np.random.randint(1, 7, 500)) 

dices = dice_1 + dice_2 

# plotting the requency of a 2 times 6 sided dice role 
fc = collections.Counter(dices) 
freq = pd.Series(fc) 
freq.plot(kind='line', alpha=0.6, linestyle='-', marker='o') 
freq.plot(kind='bar', color='k', alpha=0.6) 

Und hier ist die grafische Darstellung.

enter image description here

Der Datensatz dieselben jedoch die Liniendiagramm ist, bewegt wird, zwei Datenpunkte auf der rechten Seite (beginnt bei 4 statt 2). Wenn ich sie getrennt zeichne, erscheinen sie korrekt (beide beginnend bei 2). Was ist also anders, wenn ich sie in derselben Graphik zeichne? Und wie behebt man das?

+0

Das Problem ist, denke ich, in der Bearbeitung in Joe Kingtons Antwort beschrieben [hier] (http://stackoverflow.com/questions/7733693/matplotlib-overlay-plot S-mit-verschiedenen-Skalen). Aber das ist jetzt 5 Jahre alt und da ich bezweifle, dass dies ein wünschenswertes Verhalten ist, frage ich mich, ob es eine schöne Lösung gibt. Immer noch suchend. – roganjosh

Antwort

1

Ich war nicht in der Lage, einen einfacheren Weg zu finden, als die X-Achse Daten wieder zu liefern. Wenn dies für einen viel größeren Ansatz, den Sie verwenden, repräsentativ ist, dann müssen Sie diese Daten vielleicht eher aus einer pd.Series() als aus Listen zusammenstellen, aber dieser Code wird Ihnen zumindest die gewünschte Grafik liefern. Ändern Sie iteritems() zu items()

Es scheint, dass einige automatische Skalierung der X-Achse nach dem Liniendiagramm stattfindet, die die beiden Plots von zwei Punkten synchronisiert (die niedrigste Wert möglich). Es könnte möglich sein, diese automatische Skalierung auf der X-Achse zu deaktivieren, bis beide Plots erstellt wurden, aber dies scheint schwieriger zu sein.

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

# roll two 6-sided dices 500 times 
dice_1 = pd.Series(np.random.randint(1, 7, 500)) 
dice_2 = pd.Series(np.random.randint(1, 7, 500)) 

dices = dice_1 + dice_2 

# plotting the requency of a 2 times 6 sided dice role 
fc = collections.Counter(dices) 

x_axis = [key for key, value in fc.iteritems()] 
y_axis = [value for key, value in fc.iteritems()] 

plt.plot(x_axis, y_axis, alpha=0.6, linestyle='-', marker='o') 
plt.bar(x_axis, y_axis, color='k', alpha=0.6, align='center') 
plt.show() 
1

Dies geschieht, weil die Serie Plot Verwendung Index, wird die use_index-False Einstellung das Problem beheben, schlage ich vor, auch groupby und len mit Frequenz jeder Kombination zählen

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

# roll two 6-sided dices 500 times 
dice_1 = pd.Series(np.random.randint(1, 7, 500)) 
dice_2 = pd.Series(np.random.randint(1, 7, 500)) 
dices = dice_1 + dice_2 

# returns the corresponding value of each index from dices 
func = lambda x: dices.loc[x] 

fc = dices.groupby(func).agg({'count': len}) 

ax = fc.plot(kind='line', alpha=0.6, linestyle='-', 
      marker='o', use_index=False) 
fc.plot(ax=ax, kind='bar', alpha=0.6, color='k') 

plt.show() 

Das Ergebnis gezeigt wird unter plot

Verwandte Themen