基于列中的一组的熊猫数据帧颜色编码的交互式图解

时间:2019-02-10 22:29:57

标签: python-3.x pandas d3.js plotly bokeh

我有一个示例熊猫数据框,如下所示:

D

我想绘制散点数据cnt(y)与day(x),其中将基于id列标记点(彩色/传奇)

现在,在seaborn / matplotlib中,这非常简单,我知道可以对其进行绘图,并且可以将绘图保存到文件中。

但是,我希望使用plotly / bokeh / d3 / mp3ld 等创建一个交互式情节,最后,将该情节放入url(由我选择或也许是一个基于帐户的帐户)。我的目标也是拥有悬停功能,当我将光标移到特定光标点上时,该功能将向我显示这些点的值。

我已经尝试使用ColumnDataSource的袖扣进行bokeh / plotly ,并尝试了所有方法以获取情节。但是,没有得到我想要的东西。我可以从专家那里获得一些帮助吗?谢谢您的期待。

1 个答案:

答案 0 :(得分:1)

此代码以您请求的方式绘制数据。我为数据框中的每个类别创建了一个新的数据框,因此交互式图例也可以使用。生成具有十六进制颜色字符串的数组,其长度为唯一类别数的长度,并将其添加到数据框中以赋予每个类别自己的颜色。

#!/usr/bin/python3

import pandas as pd
from bokeh.models import ColumnDataSource
from bokeh.palettes import all_palettes
from bokeh.plotting import figure, output_file, show

data = {'day': [2, 2, 2, 3, 3, 3, 5, 5, 5], 'id': ['catx', 'kagm', 'dyrt', 'catx', 'kagm', 'dyrt', 'catx', 'kagm', 'dyrt'], 'cnt': [4, 3, 5, 3, 3, 4, 2, 2, 2]}
df = pd.DataFrame.from_dict(data)

output_file('plot.html')
tooltips = [
    ("day", "@day"),
    ("id", "@$name"),
    ("count", "@cnt")]
p = figure(tooltips=tooltips, plot_width=800, plot_height=800)

sources = []
colors = all_palettes['Viridis'][len(set(df['id'].tolist()))]
pd.options.mode.chained_assignment = None #Supress false positive warning
for ID, color in zip(set(df['id'].tolist()), colors):
    dfSubset = df.loc[df['id'] == ID]
    dfSubset['color'] = color
    sources.append(ColumnDataSource(dfSubset))
    p.circle(x = 'day', y = 'cnt', legend = 'id', color = 'color', name = 'id', alpha = 0.5, size = 15, source = sources[-1])

p.legend.click_policy="hide"

show(p)

plot