python绘制聚类分析树状图

何为聚类分析?

聚类分析指将物理或抽象对象的集合分组为由类似的对象组成的多个类的分析过程。它是一种重要的人类行为。

MATLAB、SPSS等商业软件包中具有聚类分析相关功能,在普通web编程中需要直接在我们程序中使用聚类分析又不想使用商业软件,python的plotly库是一个不错的选择。

聚类分析方法有层次聚类法、K-均值聚类法等,本文为python绘制层次聚类分析图。
层次聚类分析方法的基本思想是:通过某种相似性测度计算节点之间的相似性,并按相似度由高到低排序,逐步重新连接个节点。该方法的优点是可随时停止划分,主要步骤如下:

  1. 移除网络中的所有边,得到有n个孤立节点的初始状态;
  2. 计算网络中每对节点的相似度;
  3. 根据相似度从强到弱连接相应节点对,形成树状图;
  4. 根据实际需求横切树状图,获得社区结构。

安装plotly及相关依赖

0.安装python3环境

安装python3环境网络上资料比较多,请自行安装python3环境

1.安装plotly

pip3 install plotly

2.安装相关依赖

pip3 install pandas
pip3 install numpy

数据集

数据为csv文件(csv格式其实是:逗号分隔值文件格式,可以用记事本或excel打开),示例内容test.csv为:
python绘制聚类分析树状图_第1张图片

完整代码

这里保存的文件名为:myPlotly.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

#import chart_studio
#chart_studio.tools.set_credentials_file(username='ectabv54319',api_key='jlVg40y0V512yrDBF1A9')

import sys
import os
import pandas as pd
#import chart_studio.plotly as py
import plotly.figure_factory as ff
import numpy as np

#数据集,csv格式
csvData="/opt/test.csv"
#输出的html文件路径
outFilePath="out-plotly.html"
#是否在浏览器中打开生成的html文件
autoOpenOnBrowser=False

####function echo() start######
def echo( param,*args ):
    if len(args)==0:
        print(param)
    else:
        for var in args:
            if var=='':
                print(param,end='')
            else:
                print(param)
####function echo() end#######

############### help start ##########################
def _help():
    echo("Usage: %s [Options]" % (sys.argv[0]))
    echo("Options:")
    echo("    -?,-h,-help,--help \t :this help")
    echo("    -csv=csvPath \t :csvPath是数据集csv文件路径")
    echo("    -out=outHtmlPath \t :outHtmlPath是输出的html文件路径")
############### help end ##########################
############function: 汉化#######################
def toZhCN(saveFileName):
    with open(saveFileName, 'r+') as fo:
        filedata = fo.read(-1)
    if filedata.strip() == '':
        return False
    filedata = filedata.replace('Download plot as a png','下载图片')
    filedata = filedata.replace('"Zoom"','"局部放大"')
    filedata = filedata.replace('"Pan"','"移动"')
    filedata = filedata.replace('Zoom in','放大')
    filedata = filedata.replace('Zoom out','缩小')
    filedata = filedata.replace('Autoscale','自动缩放')
    filedata = filedata.replace('Reset axes','重置')
    filedata = filedata.replace('Toggle Spike Lines','切换峰线')
    filedata = filedata.replace('Show closest data on hover','在悬停时显示最近的数据')
    filedata = filedata.replace('Compare data on hover','比较悬停数据')
    filedata = filedata.replace('"https://plotly.com/"','"#"')
    filedata = filedata.replace('Produced with Plotly','新窗口打开')
    filedata = filedata.replace('plotly-logomark','')
    try:
        fp=open(saveFileName,"w+",encoding="utf-8")
        fp.write(filedata)
    finally:
        fp.close()
    return True
###############func:createPlotly#############
def createPlotly():
    try:
        data = pd.read_csv(csvData)
        X = data[["频次"]]
        kwdlist = list(data["关键词"])
        kwdsize = len(kwdlist)
        fig = ff.create_dendrogram(X, orientation='left',labels=kwdlist)
        layoutHeight = round((kwdsize-40)/10)*100+800
        if kwdsize<=40:
            layoutHeight = 800
        fig['layout'].update({'width':800, 'height':layoutHeight})
        #py.plot(fig, filename='dendrogram_with_labels')
        #输出html
        fig.write_html(outFilePath, auto_open=autoOpenOnBrowser)
        #fig.show()
        if os.path.exists(outFilePath):
            toZhCN(outFilePath)
        echo("success")
    except:
        echo("error:" + sys.exc_info()[0])

def main():
    global csvData
    global outFilePath
    if sys.version < '3':
        echo("error:请使用Python3")
        sys.exit(0)
    argvlen=len(sys.argv)
    if argvlen==1:
        echo("error:参数不能为空,通过 %s -? 查看参数" % sys.argv[0])
    else:
        csvDataTmp=""
        outFilePathTmp=""
        showHelp=False
        for ii in range(1,argvlen):
            paramData=sys.argv[ii]
            if paramData.startswith('-csv='):
                csvDataTmp=paramData[5:]
            elif paramData.startswith('-out='):
                outFilePathTmp=paramData[5:]
            elif paramData == '-?' or paramData == '-h' or paramData == '--help' or paramData == '-help' :
                showHelp=True
                _help()
                break
        if not showHelp:
            if csvDataTmp and os.path.exists(csvDataTmp):
                csvData=csvDataTmp
                outFilePath=outFilePathTmp
                createPlotly()
            else:
                echo("error:数据集不存在")
            if not outFilePathTmp:
                echo("error:输出的html文件路径不能为空")

if __name__ == "__main__":
    main()

使用示例:

python3 myPlotly.py -csv=/opt/test.csv -out=/opt/test.html

生成的结果:
python绘制聚类分析树状图_第2张图片

你可能感兴趣的:(Python,python,聚类分析,树状图)