Как получить гистограмму для фрейма данных временных рядов панд с помощью Bokeh?

Объяснение

В первом сценарии , когда вы используете

Task task = new Task<Void>() {
  @Override
  protected Void call() throws Exception {
      initStubGamepad();
      return null;
  }
}

Внутри initStubGamepad(), который запущен на задаче, вы пытаются обновить компоненты пользовательского интерфейса внутри методов pressBtn() и releaseBtn(), поэтому вы сталкиваетесь с

java.lang.IllegalStateException: Not on FX application thread

, поскольку все обновления пользовательского интерфейса должны встречаться в потоке JavaFX

В втором сценарии , когда вы используете

Platform.runLater(new Runnable() {
    @Override
    public void run() {
        initStubGamepad();
    }
});

, пользовательский интерфейс не появляется, потому что у вас бесконечный цикл внутри initStubGamepad(), который помещает поток приложений JavaFX в бесконечный цикл

Решение

. К тому времени, как вы сюда доберетесь, вы должны уже найти решение. Если вы этого не сделали, попробуйте поместить обновление компонентов Javafx в поток пользовательского интерфейса. Таким образом, вместо вызова initStubGamepad() внутри Platform.runLater попробуйте вызвать внутри него pressBtn() и releaseBtn().

Попробуйте использовать

while (true) {
   if (rnd.nextInt(30) == 3) {
      Platform.runLater(() -> pressBtn());            
   } else if (rnd.nextInt(30) == 7) {
       Platform.runLater(() -> releaseBtn());            
   }
}

или вы также можете использовать

public void pressBtn() {
    if(!isXPressed) {
        Platform.runLater(() -> iv1.setVisible(true));
        isXPressed = true;
    }
}
1
задан Abhishek Kulkarni 19 February 2019 в 05:48
поделиться

1 ответ

Вам нужно изменить форму DataFrame на stack для Series, затем преобразовать первый уровень MultiIndex в строки формата YYYY-MM-DD и перейти к словарю:

output_file("bars.html")

dates = pd.date_range('20190101', periods=100)

dfr = pd.DataFrame(np.random.randn(100, 6), index=dates, columns=list('ABCDEF'))

s = dfr.resample('M').sum().stack()
s.index = [s.index.get_level_values(0).strftime('%Y-%m-%d'),
           s.index.get_level_values(1)]

x = s.index.values
print (x)
[('2019-01-31', 'A') ('2019-01-31', 'B') ('2019-01-31', 'C')
 ('2019-01-31', 'D') ('2019-01-31', 'E') ('2019-01-31', 'F')
 ('2019-02-28', 'A') ('2019-02-28', 'B') ('2019-02-28', 'C')
 ('2019-02-28', 'D') ('2019-02-28', 'E') ('2019-02-28', 'F')
 ('2019-03-31', 'A') ('2019-03-31', 'B') ('2019-03-31', 'C')
 ('2019-03-31', 'D') ('2019-03-31', 'E') ('2019-03-31', 'F')
 ('2019-04-30', 'A') ('2019-04-30', 'B') ('2019-04-30', 'C')
 ('2019-04-30', 'D') ('2019-04-30', 'E') ('2019-04-30', 'F')]

counts = s.values
print (counts)
[ 5.8759305  -7.52857928  2.74794675  9.91942791  1.49860961  0.16046735
  0.15459667  3.86407105  0.79097565 -2.65899131  1.86548175  1.41251127
 -3.67053891 13.90439142  2.80744458  2.51583516 -2.37587758  4.49826959
 -0.7661524  -6.22533991  5.90391326  4.40654035  1.93598738  2.49407506]

source = ColumnDataSource(data=dict(x=x, counts=counts))

p = figure(x_range=FactorRange(*x), plot_height=250, title="Sums by Months",
       toolbar_location=None, tools="")

p.vbar(x='x', top='counts', width=0.9, source=source)

p.y_range.start = 0
p.x_range.range_padding = 0.1
p.xaxis.major_label_orientation = 1
p.xgrid.grid_line_color = None

show(p)        
0
ответ дан jezrael 19 February 2019 в 05:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: