2017-10-20 16 views
0

J'ai utilisé bokeh pour générer 400 graphiques et les a sauvegardés dans 400 fichiers html (file_1.html ... file_400.html) sur mon disque local de mon Mac.Comment afficher des centaines de fichiers html locaux efficacement par safari web-browser et Python3

Un exemple des codes que j'utilisé pour générer un graphique et l'enregistrer est inférieure

import numpy as np 

from bokeh.plotting import figure, output_file, save 

p = figure(plot_width=400, plot_height=400) 

x = np.arange(1, 1000) # all 400 graphs have the same x 
y1 = np.arange(1, 1000)*2 # different file can have different y 
p.line(x, y1, line_width=2) 

output_file('file_1.html') 
save(p) 

Je dois voir les 400 fichiers html, un par un, et je suis intéressé que dans un zoomed- en vue de chaque graphique, ce qui signifie les 100 derniers points de chaque graphique. Notez que la courbe dans chaque graphique doit être vue par moi (en raison de mon expertise), donc je ne peux pas utiliser des choses comme l'intelligence artificielle pour voir les graphiques pour moi.

Ce que je peux faire maintenant, est:

  1. ouvrir le dossier contenant ces 400 fichiers html-
  2. double-cliquez sur un fichier, puis il sera ouvert avec Safari navigateur web
  3. cliquez sur le zoom bouton -in défini par bokeh
  4. trouver la zone des 100 derniers points et faites glisser un rectangle par la souris pour zoomer en
  5. fermer ce dossier
  6. répéter les 5 étapes ci-dessus pour un autre 399 fois.

Cette approche est très longue et fastidieuse.

Avez-vous de meilleures façons de parcourir tous ces fichiers?

Une caractéristique préférée est que je peux les ouvrir tous dans une fenêtre, ils sont automatiquement zoomés, et j'ai juste besoin d'appuyer sur le bouton left-arrow et right-arrow sur mon clavier pour naviguer dans les graphiques.

Dans l'attente de votre aide et merci!

Répondre

0

Très bien, voyons comment nous pouvons faire cela. Ma première pensée est, cela pourrait être accompli à travers le sélénium. Je vais supposer que vous ne l'avez pas utilisé auparavant. En bref, c'est un moyen de faire des choses par programme avec un navigateur.

Commençons avec ça! Installez la bibliothèque python

pip install selenium 

Vous devrez également installer geckodriver (nous utiliserons firefox dans cet exemple). Si vous êtes sur osx, vous pouvez l'installer avec le brassage. Ensuite, nous pouvons commencer à écrire notre script pour ouvrir 400 onglets! Cela ouvrira toutes les figures que vous avez localement. Je vais vous laisser le soin de comprendre comment zoomer. La documentation pour le sélénium peut être found here ->

(le script utilise Python 3 et pathlib existe seulement en python 3)

from pathlib import Path 
from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.common.action_chains import ActionChains 

html_path = Path.cwd() 
browser = webdriver.Firefox() 

for no in range(1, 400): 
    (ActionChains(browser).key_down(Keys.CONTROL) 
          .send_keys('t') 
          .key_up(Keys.CONTROL) 
          .perform()) 
    file_path = html_path/'file_1.html' 
    browser.get('file://' + str(file_path)) 
1

Cela semble en fait comme un cas parfait d'utilisation pour une petite application de serveur de Bokeh vous pouvez exécuter localement. Vous pouvez mettre le code dans un fichier app.py puis exécuter bokeh serve --show app.py sur la ligne de commande.

import numpy as np 
from bokeh.io import curdoc 
from bokeh.models import Button, ColumnDataSource, TextInput 
from bokeh.layouts import widgetbox, row 
from bokeh.plotting import figure 

current = 0 

x = np.linspace(0, 20, 500) 
y = np.sin(x)  
source = ColumnDataSource(data=dict(x=x, y=y)) 

plot = figure(x_range=(10,20), title="Plot 0") 
plot.line('x', 'y', source=source) 

def update_data(i): 
    global current 
    current = i 

    # compute new data or load from file, etc 
    source.data = dict(x=x, y = np.sin(x*(i+1))) 
    plot.title.text = "Plot %d" % i 

def update_range(attr, old, new): 
    plot.x_range.start = float(start.value) 
    plot.x_range.end = float(end.value) 

start = TextInput(title="start", value="10") 
start.on_change('value', update_range) 
end = TextInput(title="start", value="20") 
end.on_change('value', update_range) 

next = Button(label="next") 
next.on_click(lambda: update_data(current+1)) 
prev = Button(label="prev") 
prev.on_click(lambda: update_data(current-1)) 

curdoc().add_root(row(widgetbox(start, end, next, prev), plot)) 

Cela pourrait être amélioré avec une gestion des erreurs et peut-être quelques cloches supplémentaires et de sifflets, mais je l'espère est démonstratif. Il donne l'application interactive ci-dessous:


enter image description here

+0

C'était beaucoup plus élégante solution. – Jonathan

+0

Il ya certainement des moments où Selenium est un bon outil (Bokeh l'utilise en interne pour générer des exportations PNG, par exemple) – bigreddot

+0

@bigreddot merci pour votre aide. Cela semble bien, mais dans mon cas, j'ai aussi besoin de lire le fichier html et zoomé. Dans vos codes, les graphiques sont simplement créés en mémoire, pas sauvegardés dans les fichiers. – aura