13

Python とこの興味深いプロット ライブラリの両方を学んでいるので、matplotlib でプロットをレンダリングし始めています。取り組んでいる問題のカスタム プロットについて助けが必要です。このための組み込み関数が既に存在する可能性があります。

問題: テーブル (長方形) を 96 個のセル (8 行 X 12 列) のプロットとして描画しようとしています。各代替セルを特定の色 (チェス盤のように: 黒/白の代わりに他の色の組み合わせを使用します) で色付けし、pandas データ フレームまたは python 辞書から各セルに値を挿入します。列と行のラベルを横に表示します。

サンプルデータ: http://pastebin.com/N4A7gWuH

numpy/pandas ds のセルの値を置き換えて、プロットを次のようにしたいと思います。

サンプル プロット: http://picpaste.com/sample-E0DZaoXk.png

ご意見をお待ちしております。

PS: mathplotlib のメーリング リストに同じものを投稿しました

4

1 に答える 1

36

基本的に、imshowまたはのみを使用できますmatshow

しかし、私はあなたが何を意味するのかよくわかりません。

すべての「白い」セルが他のベクトルで色付けされたチェス盤が必要な場合は、次のようにすることができます。

import matplotlib.pyplot as plt
import numpy as np

# Make a 9x9 grid...
nrows, ncols = 9,9
image = np.zeros(nrows*ncols)

# Set every other cell to a random number (this would be your data)
image[::2] = np.random.random(nrows*ncols //2 + 1)

# Reshape things into a 9x9 grid.
image = image.reshape((nrows, ncols))

row_labels = range(nrows)
col_labels = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
plt.matshow(image)
plt.xticks(range(ncols), col_labels)
plt.yticks(range(nrows), row_labels)
plt.show()

ここに画像の説明を入力

明らかに、これは行と列の数が奇数の場合にのみ機能します。行と列の数が偶数のデータセットの各行を反復処理できます。

例えば:

for i, (image_row, data_row) in enumerate(zip(image, data)):
    image_row[i%2::2] = data_row

ただし、各行の「データ」セルの数は異なるため、問題の定義で混乱します。

定義上、チェッカーボード パターンでは、各行に異なる数の「白」セルがあります。
あなたのデータはおそらく (?) 各行に同じ数の値があります。やりたいことを定義する必要があります。データを切り捨てるか、列を追加することができます。

編集:これは、列の長さが奇数の場合にのみ当てはまることに気付きました。

とにかく、私はあなたの質問にまだ混乱しています。

データの「完全な」グリッドが必要で、データ グリッドの値の「チェッカーボード」パターンを別の色に設定したいですか、それともプロットされた値の「チェッカーボード」パターンでデータを「散在」させたいですか?一定の色として?

アップデート

スプレッドシートのようなものが欲しいようですね。Matplotlib はこれには理想的ではありませんが、実行できます。

をそのまま使用するのが理想的ですplt.tableが、この場合はmatplotlib.table.Table直接使用する方が簡単です。

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

from matplotlib.table import Table

def main():
    data = pandas.DataFrame(np.random.random((12,8)), 
                columns=['A','B','C','D','E','F','G','H'])
    checkerboard_table(data)
    plt.show()

def checkerboard_table(data, fmt='{:.2f}', bkg_colors=['yellow', 'white']):
    fig, ax = plt.subplots()
    ax.set_axis_off()
    tb = Table(ax, bbox=[0,0,1,1])

    nrows, ncols = data.shape
    width, height = 1.0 / ncols, 1.0 / nrows

    # Add cells
    for (i,j), val in np.ndenumerate(data):
        # Index either the first or second item of bkg_colors based on
        # a checker board pattern
        idx = [j % 2, (j + 1) % 2][i % 2]
        color = bkg_colors[idx]

        tb.add_cell(i, j, width, height, text=fmt.format(val), 
                    loc='center', facecolor=color)

    # Row Labels...
    for i, label in enumerate(data.index):
        tb.add_cell(i, -1, width, height, text=label, loc='right', 
                    edgecolor='none', facecolor='none')
    # Column Labels...
    for j, label in enumerate(data.columns):
        tb.add_cell(-1, j, width, height/2, text=label, loc='center', 
                           edgecolor='none', facecolor='none')
    ax.add_table(tb)
    return fig

if __name__ == '__main__':
    main()

ここに画像の説明を入力

于 2012-04-17T16:38:52.260 に答える