最終編集(部分的な解決策):
いろいろいじくり回した結果、やりたいことが実現できました。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 にリンクする順序はありません。したがって、ここで等高線図を適用できるかどうかはわかりません。