首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用dataframe对象创建Chord图?

如何使用dataframe对象创建Chord图?
EN

Stack Overflow用户
提问于 2021-12-04 02:14:00
回答 1查看 361关注 0票数 0

我在网上找到了这个通用代码。

代码语言:javascript
复制
import pandas as pd
import holoviews as hv
from holoviews import opts, dim
from bokeh.sampledata.les_mis import data

hv.extension('bokeh')
hv.output(size=200)

links = pd.DataFrame(data['links'])
print(links.head(3))
hv.Chord(links)

nodes = hv.Dataset(pd.DataFrame(data['nodes']), 'index')
nodes.data.head()

chord = hv.Chord((links, nodes)).select(value=(5, None))
chord.opts(
    opts.Chord(cmap='Category20', edge_cmap='Category20', edge_color=dim('source').str(), 
               labels='name', node_color=dim('index').str()))

这让这个看起来不错。

样本数据是从这里获取的。

https://holoviews.org/reference/elements/bokeh/Chord.html

显然,“链接”是熊猫的数据格式,“节点”是一个完整的视图数据集,其类型如下所示。

代码语言:javascript
复制
<class 'pandas.core.frame.DataFrame'>
<class 'holoviews.core.data.Dataset'>

所以,我的问题是,this...how我能把数据输入到和弦图中吗?这是我的数据样本。另外,我不知道如何将合并到混合中.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-04 12:50:12

我认为您的数据不符合此功能的要求。让我解释一下我为什么这么认为?

Chord-function希望至少在数据集(可以是熊猫DataFrame)上有三列,但所有元素都是数字。

代码语言:javascript
复制
   source  target  value
0       1       0      1
1       2       0      8
2       3       0     10

第二个数据集是可选的。例如,这可以使用第二列中的字符串来添加标签。

代码语言:javascript
复制
    index     name  group
0      0         a      0
1      1         b      0
2      2         c      0

基本示例

你给出的数据是这样的。

代码语言:javascript
复制
    Measure     Country Value
0   Arrivals    Greece  1590
1   Arrivals    Spain   1455
2   Arrivals    France  1345
3   Arrivals    Iceland 1100
4   Arrivals    Iceland 1850
5   Departures  America 2100
6   Departures  Ireland 1000
7   Departures  America 950
8   Departures  Ireland 1200
9   Departures  Japan   1050

如果将DataFrame df中的字符串替换为如下数字,则可以将日期以基本形式显示:

代码语言:javascript
复制
_df = df.copy()
values = list(_df.Measure.unique())+list(_df.Country.unique())
d = {value: i for i, value in enumerate(values)}

def str2num(s):
    return d[s]

_df.Measure = _df.Measure.apply(str2num)
_df.Country = _df.Country.apply(str2num)

>>> df
    Measure Country Value
0   0   2   1590
1   0   3   1455
2   0   4   1345
3   0   5   1100
4   0   5   1850
5   1   6   2100
6   1   7   1000
7   1   6   950
8   1   7   1200
9   1   8   1050

现在,您的数据与基本条件匹配,您可以创建一个Chord图。

代码语言:javascript
复制
chord = hv.Chord(_df).select(value=(5, None))
chord.opts(
    opts.Chord(cmap='Category20', edge_cmap='Category20', 
               edge_color=dim('Measure').str(), 
               labels='Country', 
               node_color=dim('index').str()))

正如你所看到的,所有的相交线只有两种颜色之一。这是因为在Measure列中只有两个元素。所以我想这不是你想要的。

修改后的示例

让我们稍微修改一下您的数据:

代码语言:javascript
复制
_list = list(df.Country.values)
new_df = pd.DataFrame({'From':_list, 'To':_list[3:]+_list[:3], 'Value':df.Value})
>>> new_df
       From      To Value
0    Greece Iceland  1590
1     Spain Iceland  1455
2    France America  1345
3   Iceland Ireland  1100
4   Iceland America  1850
5   America Ireland  2100
6   Ireland   Japan  1000
7   America  Greece   950
8   Ireland   Spain  1200
9     Japan  France  1050

以及:

代码语言:javascript
复制
node = pd.DataFrame()
for i, value in enumerate(df.Measure.unique()):
    _list = list(df[df['Measure']==value].Country.unique())
    node = pd.concat([node, pd.DataFrame({'Name':_list, 'Group':i})], ignore_index=True)
>>> node
    Name    Group
0   Greece  0
1   Spain   0
2   France  0
3   Iceland 0
4   America 1
5   Ireland 1
6   Japan   1

现在,我们必须再次替换new_df中的字符串,并且可以再次调用Chord-function。

代码语言:javascript
复制
values = list(df.Country.unique())
d = {value: i for i, value in enumerate(values)}

def str2num(s):
    return d[s]

new_df.From = new_df.From.apply(str2num)
new_df.To = new_df.To.apply(str2num)

hv.Chord(new_df)
nodes = hv.Dataset(pd.DataFrame(node), 'index')
chord = hv.Chord((new_df, nodes)).select(value=(5, None))
chord.opts(
    opts.Chord(cmap='Category20', edge_cmap='Category20', edge_color=dim('From').str(), 
               labels='Name', node_color=dim('index').str()
              )
)

现在这两个组被添加到HoverTool中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70222521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档