简体   繁体   English

Bokeh image() 绘图有什么问题? 它成功但没有显示图表

[英]What is wrong with Bokeh image() plotting? It succeed but showed no graph

I have initially a Spark dataframe with data like that:我最初有一个 Spark dataframe 的数据如下:

+-------------------+--------------+------+-----+
|window_time        |delayWindowEnd|values|index|
+-------------------+--------------+------+-----+
|2022-01-24 18:00:00|999           |999   |2    |
|2022-01-24 19:00:00|999           |999   |1    |
|2022-01-24 20:00:00|999           |999   |3    |
|2022-01-24 21:00:00|999           |999   |4    |
|2022-01-24 22:00:00|999           |999   |5    |
|2022-01-24 18:00:00|998           |998   |4    |
|2022-01-24 19:00:00|998           |998   |5    |
|2022-01-24 20:00:00|998           |998   |3    |

and I'd like to plot that as a heatmap with the following code in Apache Zeppelin:我想 plot 作为热图,在 Apache Zeppelin 中使用以下代码:

%spark.pyspark %spark.pyspark

import bkzep
import numpy as np
from bokeh.io import output_notebook, show
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource, ColorBar, LogColorMapper
from bokeh.layouts import gridplot
from pyspark.sql.functions import col, coalesce, lit, monotonically_increasing_id
from pyspark.sql import DataFrame
from pyspark.sql.functions import *

output_notebook(notebook_type='zeppelin')

then然后

%pyspark %pyspark

from pyspark.sql.functions import *从 pyspark.sql.functions 导入 *

def plot_summaries(sensor, dfName):
    df = sqlContext.table(dfName)
    pdf = df.toPandas()
    source = ColumnDataSource(pdf)

    color_mapper = LogColorMapper(palette="Viridis256", low=1, high=10)

    plot = figure(toolbar_location=None,x_axis_type='datetime')
    plot.image(x='window_time', y='delayWindowEnd', source=source, image='index',dw=1,dh=1,  color_mapper=color_mapper)

    color_bar = ColorBar(color_mapper=color_mapper, label_standoff=12)

    plot.add_layout(color_bar, 'right')
    show(gridplot([plot], ncols=1, plot_width=1000, plot_height=400))

sensors = [   
"all"
]

and then finally然后最后

%pyspark

from pyspark.sql.functions import *

keyCol = "month_day_hour"

sensors = [
    "all"]


for sensor in sensors:
    plot_summaries(sensor, "maxmin2")   

The latest one has been succeed, but I see no graph.最新的已经成功,但我没有看到图表。

在这里,我希望绘制图表,如果它不是上面代码的热图,则绘制它

That's probably because of parameters misuse.这可能是因为参数滥用。

Is it ok to use dataframe column as image parameter (while other twos will be x and y axis).是否可以使用 dataframe 列作为图像参数(而其他两个将是 x 和 y 轴)。 Are df and dw correctly initialized? df 和 dw 是否正确初始化? It is ok to have X axis being a timestamp?可以让 X 轴作为时间戳吗?

If the reason is browser rendering, there is a JS error like below:如果原因是浏览器渲染,会出现如下 JS 错误:

polyfills.d42c9551b0788083cd69.js:1 Uncaught Error: Error rendering Bokeh model: could not find #fb19be38-e25a-4ebf-a488-593cd2e9a4d6 HTML tag
    at o (bokeh-1.3.4.min.js:31:143801)
    at Object.n._resolve_root_elements (bokeh-1.3.4.min.js:31:144274)
    at Object.n.embed_items_notebook (bokeh-1.3.4.min.js:31:147281)
    at embed_document (<anonymous>:6:20)
    at <anonymous>:15:9
    at e.invokeTask (polyfills.d42c9551b0788083cd69.js:1:8063)
    at t.runTask (polyfills.d42c9551b0788083cd69.js:1:3241)
    at t.invokeTask (polyfills.d42c9551b0788083cd69.js:1:9170)
    at i.useG.invoke (polyfills.d42c9551b0788083cd69.js:1:9061)
    at n.args.<computed> (polyfills.d42c9551b0788083cd69.js:1:38948)

While the responce from Zeppelin backend with the execution and plotting results, reached the browser through websocket app, looks pretty and rather correct:虽然 Zeppelin 后端对执行和绘图结果的响应通过 websocket 应用程序到达浏览器,但看起来很漂亮而且相当正确:

https://pastebin.com/pLWBA8Cv https://pastebin.com/pLWBA8Cv

The answer was given here: https://discourse.bokeh.org/t/cant-render-heatmap-data-for-apache-zeppelins-pyspark-dataframe/8844答案在这里给出: https://discourse.bokeh.org/t/cant-render-heatmap-data-for-apache-zeppelins-pyspark-dataframe/8844

The explanation what was wrong is explained in details are at the link above.错误的解释在上面的链接中有详细解释。 Shortly, I wasn't applying the needed 2D array to the Bokeh and I had to produce it with pandas ' pivot and numpy .不久,我没有将所需的 2D 阵列应用于散景,我不得不使用pandas ' pivotnumpy来制作它。 Here is the solution:这是解决方案:

dft = sqlContext.table(dfName)
pdf = dft.toPandas()
import pandas as pd
rowIDs = pdf['values']
colIDs = pdf['window_time']

A = pdf.pivot_table('index', 'values', 'window_time', fill_value=0)
source = ColumnDataSource(data={'x':[pd.to_datetime('Jan 24 2022')] #left most
                           ,'y':[0] #bottom most 
                           ,'dw':[pdf['window_time'].max()-pdf['window_time'].min()] #TOTAL width of image
                           #,'dh':[df['delayWindowEnd'].max()] #TOTAL height of image
                           ,'dh':[1000] #TOTAL height of image
                           ,'im':[A.to_numpy()] #2D array using to_numpy() method on pivotted df
                           })

color_mapper = LogColorMapper(palette="Viridis256", low=1, high=20)

plot = figure(toolbar_location=None,x_axis_type='datetime')
plot.image(x='x', y='y', source=source, image='im',dw='dw',dh='dh',  color_mapper=color_mapper)

color_bar = ColorBar(color_mapper=color_mapper, label_standoff=12)

plot.add_layout(color_bar, 'right')
show(gridplot([plot], ncols=1, plot_width=1000, plot_height=400)) 

The result looks pretty for me:结果对我来说很漂亮:

在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM