I have been lately working with bokeh for plotting. I just found out about holoviews and wanted to plot a basic box plot.
In my box plot I am trying to color per on
You can either use HoloViews or hvplot to color your boxplots per category.
Three possible solutions are:
import numpy as np
import pandas as pd
import holoviews as hv
import hvplot
import hvplot.pandas
df = pd.DataFrame({
'total_time': np.random.randint(0, 3, 100),
'customer': np.random.randint(0, 5, 100),
'amount': np.random.rand(100)
})
1) Use .hvplot() on your dataframe as follows:
df.hvplot.box(y='amount', by=['total_time', 'customer'], color='customer')
2) Or use .opts(box_color='your_variable') and only use holoviews:
# you can create your plot like this:
hv.BoxWhisker(df, kdims=['total_time', 'customer'], vdims=['amount']).opts(box_color='customer')
# or you can create your plot like this:
hv.Dataset(df).to.box(['total_time', 'customer'], 'amount').opts(box_color='customer')
This results in the following plot where in this case each customer gets it's own color:
3) If you have categorical variables, besides box_color you also have to specify a color map with keyword cmap:
df = pd.DataFrame({
'total_time': np.random.choice(['A', 'B', 'C'], 100),
'customer': np.random.choice(['a', 'b', 'c'], 100),
'amount': np.random.rand(100)
})
df.hvplot.box(
y='amount',
by=['total_time', 'customer'],
color='customer',
cmap='Category20',
legend=False,
)
hv.BoxWhisker(
df,
kdims=['total_time', 'customer'],
vdims=['amount']
).opts(
box_color='customer',
cmap='Category20',
)
Most Elements in HoloViews have a color_index
plot option which allows coloring by a particular variable. Using your example here we color by the 'customer' variable and define a HoloViews Cycle
for the box_color using the Set1 colormap.
data = (np.random.randint(0, 3, 100), np.random.randint(0, 5, 100), np.random.rand(100))
boxwhisker = hv.BoxWhisker(data, ['total_time', 'customer'], 'amount')
plot_opts = dict(show_legend=False, width=800, height=400, color_index='customer')
style_opts = dict(box_color=hv.Cycle('Set1'))
boxwhisker.opts(plot=plot_opts, style=style_opts)
If you want to define a custom set of colors you can also define an explicit Cycle like this: Cycle(values=['#ffffff', ...])
.