bokehはヒートマップのカラーバーをプロットする簡単な方法がありますか?bokehヒートマップのカラーバーをプロットすることはできますか?
In this example色が値にどのように対応するかを示すストリップです。 MATLABで
bokehはヒートマップのカラーバーをプロットする簡単な方法がありますか?bokehヒートマップのカラーバーをプロットすることはできますか?
In this example色が値にどのように対応するかを示すストリップです。 MATLABで
UPDATE:これは簡単になりましくらいです:私は
http://bokeh.pydata.org/en/latest/docs/user_guide/annotations.html#color-bars
を見ます私が大きな答えを持っていないことを恐れて、これはBokehでもっと簡単になるはずです。しかし、私は以前このようなことを手動でやっています。
私はしばしばこれらを私のプロットから外しておきたいので、私は新しいプロットを作成し、hplot
またはgridplot
のようなものを一緒に組み立てます。
はここにその例があります:あなたのケースではhttps://github.com/birdsarah/pycon_2015_bokeh_talk/blob/master/washmap/washmap/water_map.py#L179
、プロットはかなりまっすぐ進むべきです。あなたはこのようなデータソースを作った場合:
legend = figure(tools=None)
legend.toolbar_location=None
legend.rect(x=0.5, y='value', fill_color='color', width=1, height=1, source=source)
layout = hplot(main, legend)
show(legend)
しかし、これはあなたの値はに対応した色を知っているあなたに頼るん:
| value | color
| 1 | blue
.....
| 9 | red
は、その後、あなたのような何かを行うことができます。ヒートマップチャートコールにパレットを渡すことができます - http://bokeh.pydata.org/en/latest/docs/gallery/cat_heatmap_chart.htmlのように、それを使って新しいデータソースを構築することができます。
カラーマップの周りに少なくとも1つの未解決の問題があることは間違いありません。私はちょうどオフプロットの伝説のために1つを追加したことを知っている。
これを行うには、@ birdsarahと同じことをしました。あなたのカラーマップとしてrectメソッドを使用する場合、余分なヒントとして、カラーバーで再びrectメソッドを使用し、同じソースを使用します。最終的には、カラーバーのセクションを選択し、プロットで選択することができます。
は、それを試してみてください:
をここで緩くカラーバーを生成するためのbirdsarahの応答に基づいていくつかのコードです:
def generate_colorbar(palette, low=0, high=15, plot_height = 100, plot_width = 500, orientation = 'h'):
y = np.linspace(low,high,len(palette))
dy = y[1]-y[0]
if orientation.lower()=='v':
fig = bp.figure(tools="", x_range = [0, 1], y_range = [low, high], plot_width = plot_width, plot_height=plot_height)
fig.toolbar_location=None
fig.xaxis.visible = None
fig.rect(x=0.5, y=y, color=palette, width=1, height = dy)
elif orientation.lower()=='h':
fig = bp.figure(tools="", y_range = [0, 1], x_range = [low, high],plot_width = plot_width, plot_height=plot_height)
fig.toolbar_location=None
fig.yaxis.visible = None
fig.rect(x=y, y=0.5, color=palette, width=dy, height = 1)
return fig
また、あなたがmatplot libにカラーマップをエミュレートすることに興味があるならば、これを試してください:
import matplotlib as mpl
def return_bokeh_colormap(name):
cm = mpl.cm.get_cmap(name)
colormap = [rgb_to_hex(tuple((np.array(cm(x))*255).astype(np.int))) for x in range(0,cm.N)]
return colormap
def rgb_to_hex(rgb):
return '#%02x%02x%02x' % rgb[0:3]
答え - あなたの主なプロットと一致することを確認するためにプロットのサイズに少し注意する必要があるかもしれませんし、正しく表示するために垂直バーの幅が120より大きい必要がありました。また、bk OR mplパレット文字列を使用するには、hasattr(bk.palettes、palette)else return_bokeh_colormap(palette) '' – user2561747
@ user2561747の場合、 '' palette = getattr(bk.palettes、palette)を使用しました。これは私のために働いた答えです。 – mbadawi23
これは私のウィッシュリストでも高いです。また、プロットされたデータが変更された場合(例えば、3Dデータセットの1次元を通って移動する場合)、範囲を自動的に調整する必要もある。以下のコードは、人々が役に立つと思うかもしれない何かをしています。このトリックは、データが変更されたときにデータソースを介して制御できる、余分な軸をカラーバーに追加することです。
import numpy
from bokeh.plotting import Figure
from bokeh.models import ColumnDataSource, Plot, LinearAxis
from bokeh.models.mappers import LinearColorMapper
from bokeh.models.ranges import Range1d
from bokeh.models.widgets import Slider
from bokeh.models.widgets.layouts import VBox
from bokeh.core.properties import Instance
from bokeh.palettes import RdYlBu11
from bokeh.io import curdoc
class Colourbar(VBox):
plot = Instance(Plot)
cbar = Instance(Plot)
power = Instance(Slider)
datasrc = Instance(ColumnDataSource)
cbarrange = Instance(ColumnDataSource)
cmap = Instance(LinearColorMapper)
def __init__(self):
self.__view_model__ = "VBox"
self.__subtype__ = "MyApp"
super(Colourbar,self).__init__()
numslices = 6
x = numpy.linspace(1,2,11)
y = numpy.linspace(2,4,21)
Z = numpy.ndarray([numslices,y.size,x.size])
for i in range(numslices):
for j in range(y.size):
for k in range(x.size):
Z[i,j,k] = (y[j]*x[k])**(i+1) + y[j]*x[k]
self.power = Slider(title = 'Power',name = 'Power',start = 1,end = numslices,step = 1,
value = round(numslices/2))
self.power.on_change('value',self.inputchange)
z = Z[self.power.value]
self.datasrc = ColumnDataSource(data={'x':x,'y':y,'z':[z],'Z':Z})
self.cmap = LinearColorMapper(palette = RdYlBu11)
r = Range1d(start = z.min(),end = z.max())
self.cbarrange = ColumnDataSource(data = {'range':[r]})
self.plot = Figure(title="Colourmap plot",x_axis_label = 'x',y_axis_label = 'y',
x_range = [x[0],x[-1]],y_range=[y[0],y[-1]],
plot_height = 500,plot_width = 500)
dx = x[1] - x[0]
dy = y[1] - y[0]
self.plot.image('z',source = self.datasrc,x = x[0]-dx/2, y = y[0]-dy/2,
dw = [x[-1]-x[0]+dx],dh = [y[-1]-y[0]+dy],
color_mapper = self.cmap)
self.generate_colorbar()
self.children.append(self.power)
self.children.append(self.plot)
self.children.append(self.cbar)
def generate_colorbar(self,cbarlength = 500,cbarwidth = 50):
pal = RdYlBu11
minVal = self.datasrc.data['z'][0].min()
maxVal = self.datasrc.data['z'][0].max()
vals = numpy.linspace(minVal,maxVal,len(pal))
self.cbar = Figure(tools = "",x_range = [minVal,maxVal],y_range = [0,1],
plot_width = cbarlength,plot_height = cbarwidth)
self.cbar.toolbar_location = None
self.cbar.min_border_left = 10
self.cbar.min_border_right = 10
self.cbar.min_border_top = 0
self.cbar.min_border_bottom = 0
self.cbar.xaxis.visible = None
self.cbar.yaxis.visible = None
self.cbar.extra_x_ranges = {'xrange':self.cbarrange.data['range'][0]}
self.cbar.add_layout(LinearAxis(x_range_name = 'xrange'),'below')
for r in self.cbar.renderers:
if type(r).__name__ == 'Grid':
r.grid_line_color = None
self.cbar.rect(x = vals,y = 0.5,color = pal,width = vals[1]-vals[0],height = 1)
def updatez(self):
data = self.datasrc.data
newdata = data
z = data['z']
z[0] = data['Z'][self.power.value - 1]
newdata['z'] = z
self.datasrc.trigger('data',data,newdata)
def updatecbar(self):
minVal = self.datasrc.data['z'][0].min()
maxVal = self.datasrc.data['z'][0].max()
self.cbarrange.data['range'][0].start = minVal
self.cbarrange.data['range'][0].end = maxVal
def inputchange(self,attrname,old,new):
self.updatez()
self.updatecbar()
curdoc().add_root(Colourbar())
0.12.3バージョンのBokehにはColorBarがあるためです。
このドキュメントは、私にとって非常に有用であった: http://bokeh.pydata.org/en/dev/docs/user_guide/annotations.html#color-bars
ここで他の回答が非常に複雑に見えるので、ここではボケヒートマップ上のカラーバーを生成するコードの分かりやすい作品。
import numpy as np
from bokeh.plotting import figure, show
from bokeh.models import LinearColorMapper, BasicTicker, ColorBar
data = np.random.rand(10,10)
color_mapper = LinearColorMapper(palette="Viridis256", low=0, high=1)
plot = figure(x_range=(0,1), y_range=(0,1))
plot.image(image=[data], color_mapper=color_mapper,
dh=[1.0], dw=[1.0], x=[0], y=[0])
color_bar = ColorBar(color_mapper=color_mapper, ticker= BasicTicker(),
location=(0,0))
plot.add_layout(color_bar, 'right')
show(plot)
更新:これは今非常に簡単です - http://bokeh.pydata.org/en/latest/docs/user_guide/annotations.html#color-barsこれがあるべき – birdsarah