2

最終編集(部分的な解決策):

いろいろいじくり回した結果、やりたいことが実現できました。17,000 を超える個別の棒グラフをプロットしているため、正確には高速なコードではありません。

解決

X = np.array(xvals)
Y = np.array(yvals)
Z = np.array(zvals)
Y_bot = np.array(bottomvals)

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

jet = plt.get_cmap('jet')

log_norm = colors.LogNorm()

for x,y,z,bot in zip(X,Y,Z,Y_bot):
    log_z = np.log10(z)/np.log10(max(Z))
    colour = jet(log_price)
    ax.bar(x,y,bottom=bot, width=1, edgecolor='none',color=c_col)

a = np.vstack((Z,Z))
im = plt.imshow(a, aspect='auto', cmap=jet, origin='lower', norm=log_norm)
im.set_visible(False)
plt.colorbar(format='%.1f')
plt.axis([values])
plt.show()

これにより、必要なプロットを正常に作成できます。カラーバーが自動的に作成され、適切にフォーマットされます。

---- 元の質問の開始 ----

matplotlib (python 2.7) の一連の積み上げ棒グラフに対数カラー マップを組み込もうとしています。基本的に、各「スタック」値には、対数変換を適用し、それをカラー マップの一部として使用するセカンダリ値があります。

プロットを作成するために実行される 2 つのループがあります。

import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cm as cm
import matplotlib.colors as colors
import matplotlib.colorbar as cb
import matplotlib.ticker as tk    

for i in range(1,x):
    # get data for point i
    for n, j in enumerate(data):
        cval = log10(secondary value)
        plt.bar(i,j, bottom=sum(j[:n]), color=cm.jet(cval)

# Once it has all been plotted I want to set axis, titles and set up a color bar
# To set up the color bar I'm currently using

im = plt.imshow(a, aspect='auto',cmap=jet, origin='lower')
im.set_visible(False)
cbar = plt.colorbar()

ここでの問題は、これらの値がログ変更値であることです (これは、データをプロットするために使用してきたものであるため、正しいです)。

しかし、逆変換 (例: 10 ** x) を実行し、それらの値をカラーバーに表示したいと考えています。

これまでのところ、次を使用してみました:

cbar.ax.get_yticklabels() # This gets text values, not floats
cbar.ax.get_yticks() # This gets the positions

次を使用して目盛りラベルを更新できることを知っています。

cbar.ax.set_yticklabels(new_ticks)

ただし、変換を行う方法で目盛り値を取得する一般的な方法が必要です。

返されるテキスト値の現在の形式は次のとおりです。

Text(1,0,u'\u22121.6') # Corresponds to -1.6 in unicode (I think).

どんな支援も大歓迎です、これは私の頭を悩ませてきました.

最終的には次のようになります (注意: これらの目盛りの値は手動で調整しました。軸ラベルは重要ではないため削除されています)。

ここに画像の説明を入力

編集:

また、データの hexbin プロットも作成しました。これは、非常にゴツゴツしていて、一般的に扱いにくいことがわかります。

ここに画像の説明を入力

上記の問題を一般化します。

(表記、z=要素、Z=ベクトル配列など)

2 つの一意のインデックス (x、y) を持つデータ配列 Z があります。

2 つのインデックス (x、y) で指定された場所に z の各値をプロットしたいと思います。z は対数的に色付けする必要があります。さらに、このプロットでカラーバーをプロットしたいと思います。理想的には、最初の積み上げ棒グラフと同様に、スペースを埋める必要があります。

X は 1.0 から 48.0 の範囲の整数の配列 (型は float ですが) であることに注意してください。ただし、Y は制約のない浮動小数点数であり、各値を X にリンクする順序はありません。したがって、ここで等高線図を適用できるかどうかはわかりません。

4

1 に答える 1

1

いろいろいじくり回した結果、やりたいことが実現できました。17,000 を超える個別の棒グラフをプロットしているため、正確には高速なコードではありません。

解決

X = np.array(xvals)
Y = np.array(yvals)
Z = np.array(zvals)
Y_bot = np.array(bottomvals)

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

jet = plt.get_cmap('jet')

log_norm = colors.LogNorm()

for x,y,z,bot in zip(X,Y,Z,Y_bot):
    log_z = np.log10(z)/np.log10(max(Z))
    colour = jet(log_price)
    ax.bar(x,y,bottom=bot, width=1, edgecolor='none',color=c_col)

a = np.vstack((Z,Z))
im = plt.imshow(a, aspect='auto', cmap=jet, origin='lower', norm=log_norm)
im.set_visible(False)
plt.colorbar(format='%.1f')
plt.axis([values])
plt.show()

これにより、必要なプロットを正常に作成できます。カラーバーが自動的に作成され、適切にフォーマットされます。

于 2012-11-01T01:47:36.200 に答える