2015-09-16 89 views

答えて

7

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つを追加したことを知っている。

+0

更新:これは今非常に簡単です - http://bokeh.pydata.org/en/latest/docs/user_guide/annotations.html#color-barsこれがあるべき – birdsarah

2

これを行うには、@ birdsarahと同じことをしました。あなたのカラーマップとしてrectメソッドを使用する場合、余分なヒントとして、カラーバーで再びrectメソッドを使用し、同じソースを使用します。最終的には、カラーバーのセクションを選択し、プロットで選択することができます。

は、それを試してみてください:

http://simonbiggs.github.io/electronfactors

3

をここで緩くカラーバーを生成するための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] 
+1

答え - あなたの主なプロットと一致することを確認するためにプロットのサイズに少し注意する必要があるかもしれませんし、正しく表示するために垂直バーの幅が120より大きい必要がありました。また、bk OR mplパレット文字列を使用するには、hasattr(bk.palettes、palette)else return_bokeh_colormap(palette) '' – user2561747

+0

@ user2561747の場合、 '' palette = getattr(bk.palettes、palette)を使用しました。これは私のために働いた答えです。 – mbadawi23

0

これは私のウィッシュリストでも高いです。また、プロットされたデータが変更された場合(例えば、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()) 
1

ここで他の回答が非常に複雑に見えるので、ここではボケヒートマップ上のカラーバーを生成するコードの分かりやすい作品。

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) 

enter image description here

関連する問題