Matplotlib表中的图例颜色功能?

时间:2011-03-30 19:42:50

标签: matplotlib colors key legend

有没有人知道是否可以在Matplotlib中使用图例功能中的标准颜色框,并将这些框放在表格的行中?

例如,请看这个图表:

http://www.winplanet.com/img/screenshots/excel-datatable.gif

在底部的表格中,您会看到行项目旁边的小颜色框。

这可能与Matplotlib有关吗?

1 个答案:

答案 0 :(得分:1)

排序,但我不确定你是否可以这样做,所以你也可以调整窗口大小(除了所有的绘图之外)。

我改编了http://matplotlib.sourceforge.net/users/screenshots.html的'table'示例。它使用一个跨越整个图形的单独轴,并在正确的位置添加自定义矩形块。正确的位置就是试验和错误定义正确的位置。

#!/usr/bin/env python
import matplotlib

from pylab import *
from matplotlib.colors import colorConverter


#Some simple functions to generate colours.
def pastel(colour, weight=2.4):
    """ Convert colour into a nice pastel shade"""
    rgb = asarray(colorConverter.to_rgb(colour))
    # scale colour
    maxc = max(rgb)
    if maxc < 1.0 and maxc > 0:
        # scale colour
        scale = 1.0 / maxc
        rgb = rgb * scale
    # now decrease saturation
    total = sum(rgb)
    slack = 0
    for x in rgb:
        slack += 1.0 - x

    # want to increase weight from total to weight
    # pick x s.t.  slack * x == weight - total
    # x = (weight - total) / slack
    x = (weight - total) / slack

    rgb = [c + (x * (1.0-c)) for c in rgb]

    return rgb

def get_colours(n):
    """ Return n pastel colours. """
    base = asarray([[1,0,0], [0,1,0], [0,0,1]])

    if n <= 3:
        return base[0:n]

    # how many new colours to we need to insert between
    # red and green and between green and blue?
    needed = (((n - 3) + 1) / 2, (n - 3) / 2)

    colours = []
    for start in (0, 1):
        for x in linspace(0, 1, needed[start]+2):
            colours.append((base[start] * (1.0 - x)) +
                           (base[start+1] * x))

    return [pastel(c) for c in colours[0:n]]


figure(1)
clf()
ax = axes([0.2, 0.2, 0.7, 0.6])   # leave room below the axes for the table

data = [[  66386,  174296,   75131,  577908,   32015],
        [  58230,  381139,   78045,   99308,  160454],
        [  89135,   80552,  152558,  497981,  603535],
        [  78415,   81858,  150656,  193263,   69638],
        [ 139361,  331509,  343164,  781380,   52269]]

colLabels = ('Freeze', 'Wind', 'Flood', 'Quake', 'Hail')
rowLabels = ['    %d year' % x for x in (100, 50, 20, 10, 5)]

# Get some pastel shades for the colours
colours = get_colours(len(colLabels))
colours.reverse()
rows = len(data)

ind = arange(len(colLabels)) + 0.3  # the x locations for the groups
cellText = []
width = 0.4     # the width of the bars
yoff = array([0.0] * len(colLabels)) # the bottom values for stacked bar chart
for row in xrange(rows):
    bar(ind, data[row], width, bottom=yoff, color=colours[row])
    yoff = yoff + data[row]
    cellText.append(['%1.1f' % (x/1000.0) for x in yoff])

# Add a table at the bottom of the axes
colours.reverse()
cellText.reverse()
the_table = table(cellText=cellText,
                  rowLabels=rowLabels,
                  colLabels=colLabels,
                  loc='bottom')


ylabel("Loss $1000's")
vals = arange(0, 2500, 500)
yticks(vals*1000, ['%d' % val for val in vals])
xticks([])
title('Loss by Disaster')

ax2 = axes([0,0,1,1], frameon=False)
ax2.xaxis.set_visible(False)
ax2.yaxis.set_visible(False)

for ind, k in enumerate(colours):
    rect = matplotlib.patches.Rectangle((.07, -.0278*ind+.15), .015, .015, fill=True, fc = k, ec = '.0')
    ax2.add_patch(rect)                     

show()