每个类别的 Holoviews 颜色
Holoviews color per category
我最近一直在使用 bokeh 进行绘图。我刚刚发现了全息视图并想绘制一个基本的箱线图。
在我的箱形图中,我试图为我将数据分组的类别之一着色。这是我使用的代码:
hv.extension('bokeh')
%opts BoxWhisker (box_color='blue')
boxwhisker = hv.BoxWhisker(pool_ride_distance_time_year_less_hour, ['total_time', 'customer'], 'amount')
plot_opts = dict(show_legend=False, width=800, height=400)
我试图根据客户变量(这是一个 yes/no 虚拟变量)为其着色不同。当我尝试在 box_color 中包含一个列表时,它不起作用。此外,在数据集中包含一个带有颜色的额外变量也无法解决问题。关于如何使其工作的任何想法?谢谢!
HoloViews 中的大多数元素都有一个 color_index
绘图选项,允许按特定变量着色。在此处使用您的示例,我们按 'customer' 变量着色,并使用 Set1 颜色图为 box_color 定义一个 HoloViews Cycle
。
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)
如果您想定义一组自定义颜色,您还可以像这样定义一个明确的循环:Cycle(values=['#ffffff', ...])
。
您可以使用 HoloViews 或 hvplot 为每个类别的箱线图着色。
三种可能的解决方案是:
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) 在你的数据框上使用 .hvplot() 如下:
df.hvplot.box(y='amount', by=['total_time', 'customer'], color='customer')
2) 或使用 .opts(box_color='your_variable') 并且仅使用全息视图:
# 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')
这导致了下图,在这种情况下,每个客户都有自己的颜色:
3) 如果你有分类变量,除了box_color你还必须用关键字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',
)
我最近一直在使用 bokeh 进行绘图。我刚刚发现了全息视图并想绘制一个基本的箱线图。
在我的箱形图中,我试图为我将数据分组的类别之一着色。这是我使用的代码:
hv.extension('bokeh')
%opts BoxWhisker (box_color='blue')
boxwhisker = hv.BoxWhisker(pool_ride_distance_time_year_less_hour, ['total_time', 'customer'], 'amount')
plot_opts = dict(show_legend=False, width=800, height=400)
我试图根据客户变量(这是一个 yes/no 虚拟变量)为其着色不同。当我尝试在 box_color 中包含一个列表时,它不起作用。此外,在数据集中包含一个带有颜色的额外变量也无法解决问题。关于如何使其工作的任何想法?谢谢!
HoloViews 中的大多数元素都有一个 color_index
绘图选项,允许按特定变量着色。在此处使用您的示例,我们按 'customer' 变量着色,并使用 Set1 颜色图为 box_color 定义一个 HoloViews Cycle
。
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)
如果您想定义一组自定义颜色,您还可以像这样定义一个明确的循环:Cycle(values=['#ffffff', ...])
。
您可以使用 HoloViews 或 hvplot 为每个类别的箱线图着色。
三种可能的解决方案是:
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) 在你的数据框上使用 .hvplot() 如下:
df.hvplot.box(y='amount', by=['total_time', 'customer'], color='customer')
2) 或使用 .opts(box_color='your_variable') 并且仅使用全息视图:
# 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')
这导致了下图,在这种情况下,每个客户都有自己的颜色:
3) 如果你有分类变量,除了box_color你还必须用关键字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',
)