多维数据和情节图例

时间:2012-12-02 20:46:40

标签: python matplotlib

我有这个情节:

data = {'User 1': [1,2,3], 'User 2': [5, 8, 10], 'User 3': [80, 75, 100], 'User 4': [65, 80, 45]}
characteristics = [('commits', 'r'), ('intended h', 'g'), ('actual h', 'b')]

n_bars = (len(characteristics)+1)*len(data)

fig = plt.figure(figsize=(5,5))
ax = fig.add_axes([0.15, 0.15, 0.65, 0.7])
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.set_yticklabels(data.keys())
ax.set_yticks(np.arange(len(characteristics)/2, n_bars, len(data)))

pers_id = 0
bar_id = 0

for name, data in data.iteritems():
    for char_id, characteristic in enumerate(characteristics):
        ax.barh(bar_id, data[char_id], facecolor=characteristic[1])
        bar_id = bar_id + 1
    ax.barh(bar_id, 100, facecolor='white', linewidth=0)
    bar_id += 1
    pers_id += 1

plt.savefig('perf.png')
plt.show()

enter image description here

我仍然需要的唯一重要功能是在右上方添加一个图例,标注位于characteristics[i][0],颜色来自characteristics[i][0]

我如何才能使这个工作?

2 个答案:

答案 0 :(得分:2)

pandas有一些数据结构和方法来处理和绘制这些数据:

In [89]: import pandas as pd

In [90]: df = pd.DataFrame(data).T

In [91]: df.columns = [c[0] for c in characteristics]

In [92]: df
Out[92]: 
        commits  intended h  actual h
User 1        1           2         3
User 2        5           8        10
User 3       80          75       100
User 4       65          80        45

In [93]: colors = [c[1] for c in characteristics]

In [94]: df.sort_index(ascending=False).plot(kind='barh', color=colors)

pandas_barh

答案 1 :(得分:1)

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

data = {'User 1': [1,2,3], 'User 2': [5, 8, 10], 'User 3': [80, 75, 100],
        'User 4': [65, 80, 45]}
characteristics = [('commits', 'r'), ('intended h', 'g'), ('actual h', 'b')]

n_bars = (len(characteristics)+1)*len(data)

fig = plt.figure(figsize=(5,5))
ax = fig.add_axes([0.15, 0.15, 0.65, 0.7])
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.set_yticklabels(data.keys())
ax.set_yticks(np.arange(len(characteristics)/2, n_bars, len(data)))

pers_id = 0
bar_id = 0

artists = collections.deque(maxlen = len(characteristics))
labels = collections.deque(maxlen = len(characteristics))
for name, data in data.iteritems():
    for char_id, characteristic in enumerate(characteristics):
        artist, = ax.barh(bar_id, data[char_id], facecolor=characteristic[1])
        artists.append(artist)
        labels.append(characteristic[0])
        bar_id = bar_id + 1
    ax.barh(bar_id, 100, facecolor='white', linewidth=0)
    bar_id += 1
    pers_id += 1

plt.legend(artists, labels, loc = 'best')
# plt.savefig('perf.png')
plt.show()

的产率 enter image description here