2017-10-21 45 views
0

Voici un exemple du code ici: https://imgur.com/a/mKPNPComment organiser les données pour spécifier une plage pour un hbar_stack qui n'est pas relative à 0? [Bokeh]

from bokeh.io import output_file, show 
from bokeh.models import ColumnDataSource 
from bokeh.palettes import GnBu3, OrRd3 
from bokeh.plotting import figure 

output_file("stacked_split.html") 

fruits = ['Apples', 'Pears', 'Nectarines', 'Plums', 'Grapes', 'Strawberries'] 
years = ["2015", "2016", "2017"] 

exports = {'fruits' : fruits, 
      '2015' : [2, 1, 4, 3, 2, 4], 
      '2016' : [5, 3, 4, 2, 4, 6], 
      '2017' : [3, 2, 4, 4, 5, 3]} 
imports = {'fruits' : fruits, 
      '2015' : [-1, 0, -1, -3, -2, -1], 
      '2016' : [-2, -1, -3, -1, -2, -2], 
      '2017' : [-1, -2, -1, 0, -2, -2]} 

p = figure(y_range=fruits, plot_height=250, x_range=(-16, 16), title="Fruit import/export, by year", 
      toolbar_location=None) 

p.hbar_stack(years, y='fruits', height=0.9, color=GnBu3, source=ColumnDataSource(exports), 
      legend=["%s exports" % x for x in years]) 

p.hbar_stack(years, y='fruits', height=0.9, color=OrRd3, source=ColumnDataSource(imports), 
      legend=["%s imports" % x for x in years]) 

p.y_range.range_padding = 0.1 
p.ygrid.grid_line_color = None 
p.legend.location = "top_left" 
p.axis.minor_tick_line_color = None 
p.outline_line_color = None 

show(p) 

je remarquai que dans cet exemple de hbar_stack, les barres sont rendus par rapport sur la base des données relatives à 0.

Comment se Je vais spécifier une plage pour une barre qui n'inclut pas 0? Par exemple, si je voulais une barre entre 5 et 10?

+0

Veuillez écrire le code réel, ** NOT ** une image du code. – James

+0

@James l'a corrigé! –

Répondre

1

Malheureusement, hbar_stack (et vbar_stack) additionnent toujours les valeurs pertinentes à partir de zéro, sans aucun type de décalage. Ajout d'un décalage semble être une chose potentiellement raisonnable et simple à considérer, donc je suggère making a GitHub issue pour demander la fonctionnalité.

Dans le même temps, il y a plusieurs façons qui pourraient travailler

  • Utilisez un appel à hbar_stack mais précuites le décalage dans vos données. Si vos colonnes CDS sont des séries numpy ou pandas, ce serait simple (ajoutez le décalage à chaque colonne empilée). Quelque chose comme:

    for x in years: 
        imports[year] += offset 
        exports[year] += offset 
    

    Cela ne fonctionnera pas comme-est avec le code ci-dessus parce que les colonnes sont des listes Python régulières, mais si vous utilisez des tableaux/séries puis en ajoutant le décalage serait comme ci-dessus.

  • Utilisez plusieurs appels à hbar et empilez les barres vous-même. La méthode hbar glyph accepte un agencement left qui est par défaut à zéro, mais vous pouvez le définir comme vous le souhaitez, soit une valeur fixe, soit une colonne CDS. Ce sera également plus facile si les colonnes de la CDS sont des tableaux ou séries:

    left = offset 
    for x in years: 
        right = left + exports[x] 
        p.hbar(left=left, right=right) 
        left = right 
    
    right = offset 
    for x in years: 
        left = right - imports[x] 
        p.hbar(left=left, right=right) 
        right = left 
    
  • Utilisez un CustomJSTransform pour faire l'empilement du côté client. Fondamentalement, vous souhaitez ré-implémenter Stack mais avec un décalage cuit dans

0

J'ai utilisé cette fonction pour définir la gamme de couleurs sans partir de zéro. J'espère que cela vous aide.

def painter(rate,max_value,min_value,palette): 
     darkness = int(float(len(palette)-1) * float(rate - min_value)/float(max_value - min_value)) 
     return palette[darkness]