code_to_joy
code_to_joy

Reputation: 623

Why is Holoviz Panel showing text instead of seaborn plot?

I want to create a Holoviz Panel dashboard in a Jupyter Notebook, containing a seaborn strip plot. I can get the dashboard to display matplotlib plots successfully but the seaborn plot is not displayed - just some text (AxesSubplot(0.125,0.125;0.775x0.755)).

I've looked at some examples on the Holoviz website and searched for seaborn specific examples but can't find any. I've also searched StackOverflow and Google and have not found anything that shows me how to successfully display a seaborn plot.

My code:

import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import panel as pn
import hvplot as hv

# create a data set of animal ratings
df = pd.DataFrame({'Animal':['Pig', 'Goat' ,'Sheep', 'Frog', 'Goat', 'Goat', 'Pig', 'Sheep', 'Octopus'], 
                   'Rating':[3, 10, 3, 2, 9, 10, 4, 1, 1]})

# define the holoviz panel parameter selector and plots in a class
class RatingsDashboard(param.Parameterized):

    # widget containing the list of animals
    Animal = param.ObjectSelector(default='Goat', objects=list(df.Animal.unique()))

    title = 'Ratings for '
    xlabel = 'Rating'
    ylim = (0, 3)

    def get_data(self):
        class_df = df[(df.Animal==self.Animal)].copy()
        return class_df

    def hist_view_all(self):
        plot = plt.figure()
        plot.add_subplot(111).hist(df['Rating'])
        plt.close(plot)
        return plot

    # seaborn strip plot for all ratings for all animals
    def strip_view_all(self):
        plot = sns.stripplot(data = df, x='Animal', y='Rating', jitter=False, size=10)
        return plot

    def hist_view(self):
        data = self.get_data()
        title = "Histogram: " + self.title

        plot = plt.figure()
        plot.add_subplot(111).hist(data['Rating'])
        plt.title('Histogram of ' + self.title + self.Animal, size=14)
        plt.xlabel(self.xlabel, size=14)
        plt.xticks(size=12)
        plt.yticks(size=12)
        plt.ylim(self.ylim)

        plt.close(plot)
        return plot

    def table_view(self):
        data = self.get_data()
        return data

# create an instance of the class
rd = RatingsDashboard(name='')

# define the dashboard elements using a subset of the rd class plots
dashboard3 = pn.Column('## Animal Ratings', rd.strip_view_all, rd.param,
          pn.Row(rd.hist_view, rd.table_view))

# display the dashboard
dashboard3

Output: panel dashboard output

Seaborn Strip Plot output that should be displayed instead of the text: enter image description here

Upvotes: 0

Views: 1099

Answers (1)

code_to_joy
code_to_joy

Reputation: 623

Thanks to user ImportanceOfBeingErnest for answering this:

hist_view_all returns a figure, while strip_view_all returns an axes. Best name variables according to what they contain, ax = sns.stripplot(...), and return the figure, return ax.figure

Upvotes: 2

Related Questions