2017-09-07 3 views
1

Je travaille actuellement sur un script Bokeh qui affichera un catalogue de tremblement de terre sur une carte. Jusqu'à présent, j'ai eu peu de problèmes, mais je suis tombé sur quelques questions.Extrait les données sélectionnées dans Bokeh au fichier texte et d'autres questions

1) Je suis tombé sur ce stackoverflow Q & A: Get selected data contained within box select tool in Bokeh, ce qui a été très utile pour apprendre à utiliser CutsomJS pour prendre les données sélectionnées et les sortir. J'ai, cependant, rencontré un peu d'étrangeté. Le script semble seulement fonctionner correctement pour moi dans le cahier de Jupyter. La partie CustomJS se lit comme suit:

source.callback = CustomJS(args=dict(p=p), code=""" 
     var inds = cb_obj.get('selected')['1d'].indices; 
     var d1 = cb_obj.get('data'); 
     console.log(d1) 
     var kernel = IPython.notebook.kernel; 
     IPython.notebook.kernel.execute("inds = " + inds); 

Si je l'essaye en cours d'exécution à travers et fenêtre html, la commande suivante n'a pas de sortie:

subset = zip([source.data['xvals'][i] for i in inds], 
    [source.data['yvals'][i] for i in inds]) 
subset_array = np.array(subset) 
outfile = 'Scripts/subset.xy' 
fo = open(outfile,'w') 
for i in range(len(subset_array)): 
    print(subset_array[i,0],subset_array[i,1],file=fo) 
fo.close() 

Je pourrais utiliser quelques conseils sur la façon d'obtenir les données sélectionnées pour produire une variable, et finalement un fichier texte lors de l'utilisation de html, par opposition à l'ordinateur portable Jupyter.

2) J'ai essayé de créer une légende pour mon intrigue. Les tremblements de terre sont indiqués par des cercles (il s'agit donc d'un tracé circulaire), et les cercles varient en taille en fonction de leur magnitude et de leur couleur en fonction de leur profondeur, que j'ai appris à travailler. Ce que je voudrais faire, c'est montrer des cercles de différentes tailles dans la légende, chacun reflétant des grandeurs différentes (Mag 1, Mag 2, Mag 3, etc.). Voici la commande que j'utilise pour tracer les données:

p.circle("xvals", "yvals",source=source, size="radius", fill_color=transform("depth", mapper),legend = 'Magnitude') 

J'ai essayé de déconner avec les commandes de légende, mais il est moi un peu difficile tout pour à Grok, même si je me sens comme cela devrait être un assez simple chose à faire. Je utilise la dernière version de Bokeh (0.12.7) et Python 2.7.12. Merci pour toute aide, et j'apprécie le temps!

Répondre

0

Sur la question 1):

Si vous créez votre fichier HTML avec la fonction output_file de Bokeh, vous ne pouvez pas accéder à un code de python, puisque le fichier résultant est juste html + javascript. La fonctionnalité d'enregistrement de fichier pourrait être intégrée dans le code javascript (un peu difficile car il semble qu'il n'y ait pas de solution qui fonctionne dans tous les navigateurs). Une autre option serait d'exécuter un serveur bokeh et d'implémenter un mécanisme pour pousser les données vers le client. Voici un exemple approximatif où la fonctionnalité d'enregistrement de fichier est incluse dans le fichier HTML. Cela devrait fonctionner sur les navigateurs non IE.

from random import random 
from bokeh.plotting import figure, output_file, show, ColumnDataSource 
from bokeh.models import CustomJS, Button 
from bokeh.layouts import row, column 

# Create some random data and put it into a ColumnDataSource 
x = [random() for x in range(100)] 
y = [random() for y in range(100)] 
source_data = ColumnDataSource(data=dict(x=x, y=y)) 

# Create a button that saves the coordinates of selected data points to a file 
savebutton = Button(label="Save", button_type="success") 
savebutton.callback = CustomJS(args=dict(source_data=source_data), code=""" 
     var inds = source_data.selected['1d'].indices; 
     var data = source_data.data; 
     var out = ""; 
     for (i = 0; i < inds.length; i++) { 
      out += "(" + data['x'][inds[i]] + ", " + data['y'][inds[i]] +") "; 
     } 
     var file = new Blob([out], {type: 'text/plain'}); 
     var elem = window.document.createElement('a'); 
     elem.href = window.URL.createObjectURL(file); 
     elem.download = 'selected-data.txt'; 
     document.body.appendChild(elem); 
     elem.click(); 
     document.body.removeChild(elem); 
     """) 

# Plot the data and save the html file 
p = figure(plot_width=400, plot_height=400, tools="lasso_select, reset") 
p.circle(x='x', y='y', source=source_data) 
plot = column(p, savebutton) 
output_file("test.html") 
show(plot)