社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

作图详解 | 利用Python绘制弦图

专利分析可视化 • 7 年前 • 2947 次点击  

弦图是一种用于描述节点之间关系的图表,属于流可视化类型的一种(相关链接:图表介绍 | 流可视化)。

弦图中,节点位于圆环上,弦位于圆环内部。节点之间的连线(弦)表示两个节点之间存在联系,而连线(弦)的粗细表示两个节点之间的联系程度。

弦图在专利信息的可视化展示中也有很多应用:

  • 展示申请人之间的合作申请,弦的粗细表示不同申请人之间合作申请数量的多少,这种数据中,合作申请是双向的,因此弦图中的弦不需要加箭头。

  • 展示专利申请的流向,弦的粗细表示某一国家的申请人向另一国家专利局提交的申请数量多少,这种数据往往需要在弦图的弦上加上箭头来表示申请的流动方向。(相关链接:[每日一图]专利申请五局流向分析的弦图可视化)。

本文为大家介绍第一种弦图(展示申请人之间的合作申请)的Python制作方法。下次再介绍第二种带箭头的弦图的制作方法。


截至今天为止,尚没有开源免费的Python库能完美且简单地绘制弦图。在绘制弦图方面常用的是R语言、Echarts或者D3.js。尽管如此,我们还是可以用Python方便的绘制出简易的弦图。

绘制弦图不再使用matplotlib绘图包,而是使用Bokeh绘图包。Bokeh绘图包已经默认集成于Anaconda软件(是3.6版本哟)中。


STEP 1:准备表格

按照如下模式建立excel表格,行数和列数可以根据需要自行输入,下表数据为生成的随机数据。

表中字母代表不同的申请人或者发明人。表格中的数字表示两两申请人或者两两发明人之间的合作申请数量。


STEP 2:程序修改

1)复制粘贴程序

将文末程序复制粘贴至spyder中的源程序编辑器(单击file,new file,跳出一个新文件)

2)适应性地修改程序

修改程序中读入的excel名称,使其与待输入excel表格名称保持一致;

修改输出图的名称(默认名为my_chord_diagram)。

3)生成图表

保存,单击F5或者绿色向右的小箭头。

得到如下效果:


弦图程序及说明如下:

import pandas as pd #导入pandas,用于操作excel文件

from bokeh.charts import output_file, Chord #导入bokeh扩展包,用于绘制弦图

from bokeh.io import show #导入文件操作中的显示网页函数

 

df=pd.read_excel('Chord.xlsx')#打开excel文件

my_links=[] #备用空列表

for i in range(len(df.columns)):#外层循环,轮询excel每个列

    print(df[df.columns[i]])

    for j inrange(len(df.index)):#内层循环,轮询excel每一行

       my_links.append({'target':(i+len(df.index)),'source':j,'value':df[df.columns[i]][j]})#生成从源到目标的字典

 

index=list(df.index)#excel行标签转化为列表

index.extend(df.columns)#合并列表,得到所有标签

my_nodes=pd.DataFrame([{'name':i} for i in index])#生成节点数据框

 

my_nodes_df = pd.DataFrame(my_nodes)#生成用于绘图的节点数据

my_links_df = pd.DataFrame(my_links)#生成用于绘图的节点间连接

 

my_source_data =my_links_df.merge(my_nodes_df, how='left',

                             left_on='source', right_index=True)#合并数据,顺序按从源到目标的顺序

 

my_source_data =my_source_data.merge(my_nodes_df, how='left',

                               left_on='target', right_index=True)#再次合并数据,顺序按从目标到源的顺序

 

chord_from_df = Chord(my_source_data, source="name_x", target="name_y", value="value")#绘制弦图

output_file( 'my_chord_diagram.html')#当前文件夹输出网页文件

show(chord_from_df)#显示图片



保护版权人人有责

小编心血,拒绝盗图,如需转载,后台联系

·↑长按识别二维码关注 ↑·

微信号:专利分析可视化

推特帐号:IPinfographics


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/S343n1igzN
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/5321
 
2947 次点击