5

Pythonで簡単なインフォグラフィックを作成したいと思います。Matplotlibには多くの機能があるようですが、私の単純なヒートマップグリッドの例をカバーするものは何もありません。

インフォグラフィックは、0から1の範囲の数字を含む単純な5 x 5グリッドです。グリッドの正方形は、0=白1=青0.5で淡い青に着色されます。

Matplotlibはおそらく使用できますが、これを生成するための洞察を提供する例を見つけたり組み合わせたりすることはできませんでした。

洞察、サンプルコード、またはライブラリの方向性は本当に役立ちます

よろしくマット

4

3 に答える 3

4

グラフを取得したら、それをどのように処理する必要があるかによって異なります。Matplotlibを使用すると、グラフを画面にインタラクティブに表示したり、ベクトル、PDF、ビットマップ形式などで保存したりできます。

このフレームワークを選択した場合imshow、必要なことを実行します。例を次に示します。

# Just some data to test:
from random import gauss
a = [[gauss(0, 10) for i in xrange(0, 5)] for j in xrange(0,5)]

from pylab import * # or just launch "IPython -pylab" from the command line

# We create a custom colormap:
myblue = cm.colors.LinearSegmentedColormap("myblue", {
    'red':   [(0, 1, 1), (1, 0, 0)], 
    'green': [(0, 1, 1), (1, 0, 0)],
    'blue':  [(0, 1, 1), (1, 1, 1)]})

# Plotting the graph:
imshow(a, cmap=myblue)

カラーマップの詳細については、このリンクを確認してください。ここにimshowのリンクがあります。または、単にandを使用help(colors.LinearSegmentedColormap)help(imshow)ます。

代替テキストhttp://img522.imageshack.us/img522/6230/bluep.png

(これは標準オプションの結果であることに注意してください。グリッドを追加したり、フィルタリングを変更したりできます)。


編集

ただし、グリッドに数字を表示したいと思っています

シンプルにするには:

for i in xrange(0,5):
    for j in xrange(0,5):
        text(i, j,
             "{0:5.2f}".format(a[i][j]),
             horizontalalignment="center",
             verticalalignment="center")
于 2009-11-02T15:19:15.880 に答える
2

PyCairoはあなたの友達です。簡単な例:

from __future__ import with_statement
import cairo
img = cairo.ImageSurface(cairo.FORMAT_ARGB32,100,100)
g = cairo.Context(img)
for x in range(0,100,10):
    for y in range(0,100,10):
        g.set_source_rgb(.1 + x/100.0, 0, .1 + y/100.0)
        g.rectangle(x,y,10,10)
        g.fill()
with open('test.png','wb') as f:
    img.write_to_png(f)

出力

このチュートリアルが役立つかもしれません。

于 2009-11-02T15:09:39.730 に答える
2

1つの可能性は、PythonからSVGを生成することです。SVGはFirefoxまたはInkscapeで表示できます。

これが簡単で汚い例です:

import random

def square(x, y, value):
    r, g, b = value * 255, value * 255, 255
    s = '<rect x="%d" y="%d" width="1" height="1" style="fill:rgb(%d,%d,%d);"/>' % (x, y, r, g, b)
    t = '<text x="%d" y="%d" font-size=".2" fill="yellow">%f</text>' % (x, y + 1, value)
    return s + '\n' + t

print('''
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="100%" height="100%" version="1.1" viewBox="0 0 5 5"
xmlns="http://www.w3.org/2000/svg">
''')
for x in range(0, 5):
    for y in range(0, 5):
        print(square(x, y, random.random()))

print('</svg>')

代替テキストhttp://www.imagechicken.com/uploads/1257184721026098800.png

于 2009-11-02T16:59:26.800 に答える