2017-03-28 7 views
1

Ich habe eine große CSV-Datei. Diese Datei wird gelesen und eine Counter wird jede vordefinierte Anzahl von Zeilen zurückgegeben. Als Beispiel:Python Stacked Balkendiagramm von Counter mit Matplotlib

counter = [Counter({(0, 1): 9, (1, 2): 8}), Counter({(1, 2): 99, (0, 1): 99}), Counter({(1, 2): 256, (0, 1): 189}), Counter({(1, 5): 473, (0, 1): 301})]

Dies ist das Skript i verwendet.

import matplotlib.pyplot as plt 
import numpy 
from collections import Counter 
counter = [Counter({(0, 1): 9, (1, 2): 8}), Counter({(1, 2): 99, (0, 1): 99}), Counter({(1, 2): 256, (0, 1): 189}), Counter({(1, 5): 473, (0, 1): 301})] 

fig = plt.figure() 
ax1 = fig.add_subplot(111) 

N = len(counter) 
ind = numpy.arange(N) 

j = 0 
while j in range(0, len(counter)): 
    a, i = 0, 0 
    frequencies = counter[j].values() 
    names = counter[j].keys() 
    while i in range(0, len(frequencies)): 
     if i == 0: 
      ax1.bar(ind, frequencies[i], label=names[i], width=0.25) 
      a = frequencies[i] 
     else: 
      ax1.bar(ind, frequencies[i], label=names[i], width=0.25, bottom=a) 
      a += frequencies[i] 
     i += 1 
    j += 1 
labels = ["%s to %s" % (200, 202)] 
ax1.set_xticks(numpy.arange(N)) 
ax1.set_xticklabels(labels) 
ax1.set_ylabel("Frequency") 
ax1.set_xlabel("Material Contact") 
ax1.legend() 

plt. show() 

Allerdings gibt es als Fehlermeldung:

ValueError: incompatible sizes: argument 'height' must be length 4 or scalar

die ich glaube, ist im Zusammenhang mit dem ind Array.

Um dies zu überwinden, habe ich die ind zu ind[j] in der if-Anweisung geändert. Das Endergebnis sind jedoch viele Bars mit vielen Farben. Die Farben beziehen sich nicht wie erwartet auf ihre jeweiligen Fächer.

ax1.bar(ind[j], frequencies[i], label=names[i], width=0.25) 

Erhalten Ergebnisse: Obtained Results

Erwartete Ergebnisse: Expected Results

Update: Eine mögliche Lösung könnte ein Array aus dem Zähler zu bauen. Dies widerspricht jedoch dem Konzept, dass der Counter überhaupt umgesetzt wird.

Antwort

0

So ist die einzige Antwort war, neu zu bewerten und die Daten

series = {} 
for key in {key for keys in counter for key in keys}: 
    series[key] = [(0 if key not in item else item[key]) for item in counter] 

Credits restrukturieren, um die Hilfe von zivoni auf python-forum

erhielt
Verwandte Themen