2015-09-16 9 views
9

क्या बोके के पास हीटमैप के लिए कलरबार प्लॉट करने का एक आसान तरीका है?क्या मैं बोके हीटमैप के लिए कलरबार प्लॉट कर सकता हूं?

In this example यह एक स्ट्रिप होगा जिसमें रंग मूल्यों के अनुरूप होते हैं।

matlab में, अपने एक 'colorbar' कहा जाता है और इस तरह दिखता है: enter image description here

उत्तर

7

अद्यतन: यह अब है ज्यादा आसान: देखने

http://bokeh.pydata.org/en/latest/docs/user_guide/annotations.html#color-bars


मैं डर है कि मेरे पास कोई अच्छा जवाब नहीं है, यह बोके में आसान होना चाहिए। लेकिन मैंने पहले ऐसा कुछ किया है।

क्योंकि मैं अक्सर इन्हें अपनी साजिश से बाहर करना चाहता हूं, मैं एक नई साजिश बना देता हूं, और फिर 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 तो आप उस से नए डेटा स्रोत बनाने के लिए इसका उपयोग कर पाएंगे।

मुझे यकीन है कि कलर मैप्स के आसपास कम-से-कम एक खुली समस्या है। मुझे पता है कि मैंने अभी ऑफ-प्लॉट किंवदंतियों के लिए एक जोड़ा है।

+0

अपडेट: यह अब बहुत आसान है - http://bokeh.pydata.org/en/latest/docs/user_guide/annotations.html#color-bars – birdsarah

2

ऐसा करने के लिए मैंने @birdsarah के समान किया। एक अतिरिक्त टिप के रूप में यदि आप अपने रंग मानचित्र के रूप में रेक्ट विधि का उपयोग करते हैं, तो फिर रंग बार में एक बार फिर से विधि विधि का उपयोग करें और उसी स्रोत का उपयोग करें। अंत परिणाम यह है कि आप कलर बार के अनुभागों का चयन कर सकते हैं और यह आपकी साजिश में भी चयन करता है।

इसे आजमाएं:

http://simonbiggs.github.io/electronfactors

3

यहाँ कुछ कोड शिथिल एक colorbar पैदा करने के लिए 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 colormaps नकल में रुचि रखते हैं, तो, इसका उपयोग करने का प्रयास करें:

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 से बड़े होने के लिए चौड़ाई की आवश्यकता होती है। इसके अलावा, बीके या एमपीएल पैलेट स्ट्रिंग्स का उपयोग करने के लिए मैंने अभी '' palette = getattr (bk.palettes, palette) का उपयोग किया है, यदि हैट्टर (bk.palettes, palette) else return_bokeh_colormap (पैलेट) '' – user2561747

+0

@ user2561747, मैं सहमत हूं। यही वह जवाब है जो मेरे लिए काम करता है। – mbadawi23

0

यह मेरी इच्छा सूची पर भी उच्च है। प्लॉट किए गए डेटा में बदलाव होने पर इसे स्वचालित रूप से सीमा समायोजित करने की आवश्यकता होगी (उदा। 3 डी डेटा सेट के एक आयाम से आगे बढ़ना)। नीचे दिया गया कोड ऐसा कुछ करता है जो लोग उपयोगी पा सकते हैं। यह चाल रंगीन रंग में अतिरिक्त अक्ष जोड़ना है जिसे डेटा डेटा के माध्यम से डेटा स्रोत के माध्यम से नियंत्रित कर सकते हैं।

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

के बाद से अन्य उत्तर यहाँ है कि एक बोकेह हीटमैप पर एक colorbar उत्पन्न कोड का एक टुकड़ा आसानी से समझ में बहुत जटिल लगते हैं, यहाँ।

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

संबंधित मुद्दे