聚类分析指将物理或抽象对象的集合分组为由类似的对象组成的多个类的分析过程。它是一种重要的人类行为。
MATLAB、SPSS等商业软件包中具有聚类分析相关功能,在普通web编程中需要直接在我们程序中使用聚类分析又不想使用商业软件,python的plotly库是一个不错的选择。
聚类分析方法有层次聚类法、K-均值聚类法等,本文为python绘制层次聚类分析图。
层次聚类分析方法的基本思想是:通过某种相似性测度计算节点之间的相似性,并按相似度由高到低排序,逐步重新连接个节点。该方法的优点是可随时停止划分,主要步骤如下:
安装python3环境网络上资料比较多,请自行安装python3环境
pip3 install plotly
pip3 install pandas
pip3 install numpy
数据为csv文件(csv格式其实是:逗号分隔值文件格式,可以用记事本或excel打开),示例内容test.csv为:
这里保存的文件名为: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