plot data interactive as rgb

Question:

I have a bunch of pictures I’d like to plot with hvplot.rgb.
The user should be able to switch between the pictures with a widget like a slider.

My problem is, that i don’t know how to use the hvplot.rgb()-function for interactive dataframes.

here’s what i have so far:

import numpy as np
import pandas as pd
import hvplot
import hvplot.pandas
import hvplot.xarray
import panel as pn

######################## generating a Dataframe with random rgb-arrays

height = 2
length = 2
count = 3      # number of pictures in dataframe


def rgb(height,lenght):
    image = np.random.randint(255, size=(height,length,3))
    x = np.arange(length)
    y = np.arange(height)
    channel = np.arange(len(image[0][0]))
    im_xr = xr.DataArray(image,coords={'y': y,'x': x,'channel': channel},dims=["y", "x", "channel"])
    return im_xr    # returning an xarray in order to use hv.plot.rgb()


list_rgb = []

for i in range(count):
    list_rgb.append(rgb(height,length))
    
df = pd.DataFrame([list_rgb]).T

df.rename(columns = {0:'rgb'}, inplace = True)

dfi = df.interactive()

slider = pn.widgets.IntSlider(name='slider', start=0, end=count-1, step=1)

pipe = dfi[(dfi.index == slider.param.value)]

so at this point i can already plot the generated pictures in the DataFrame with

df.rgb[0].hvplot.rgb(x='x', 
                 y='y', 
                 bands='channel', 
                 data_aspect=1, 
                 flip_yaxis=True, 
                 xaxis=False, 
                 yaxis=None,
                 widget_type='scrubber',
                 widget_location='bottom'
                )

How can I call the .hvplot.rgb() function to plot the "pipe"-interactive dataframe?

Asked By: Paul Borowy

||

Answers:

so here’s how to do it:


import numpy as np
import pandas as pd
import hvplot
import hvplot.pandas
import hvplot.xarray
import panel as pn

######################## generating a Dataframe with random rgb-arrays

height = 2     # height of the generated picture
width = 2     # width of the generated picture
count = 3      # number of pictures in dataframe


def rgb(height,width):
    image = np.random.randint(255, size=(height,width,3))  
    return image
    
list_rgb = []

for i in range(count):
    list_rgb.append(rgb(height,width))

    
    
x = np.arange(width)
y = np.arange(height)
channel = np.arange(3)
time = np.arange(count)
      
xar = xr.DataArray(list_rgb, 
                   dims=("time", "y", "x", "channel")
                   , 
                   coords={"x": x,
                          "y": y,
                          "channel": channel,
                          "time" : time},
                  name="rgb")
    
xar.hvplot.rgb(x='x', 
               y='y', 
               bands='channel', 
               data_aspect=1, 
               flip_yaxis=True, 
               xaxis=False, 
               yaxis=None
              )

additionally the scrubber tool is a pretty nice thing to create movies out of pictures with hvplot, like for example timelaps-shows…

xar.hvplot.rgb(x='x', 
               y='y', 
               bands='channel', 
               data_aspect=1, 
               flip_yaxis=True, 
               xaxis=False, 
               yaxis=None,
               widget_type='scrubber',
               widget_location='bottom'
              )

Answered By: Paul Borowy