河流图能够动态的直观的反映出多个指标随着时序的变化而变化。其实在pyecharts中也提供了ThemeRiver图表,后文会继续讲解;seaborn中也提供了类似的river图,不过效果不是很理想;matplotlib中提供了stackplot图表,baseline要指定为“wiggle”,不过是点与点的直线,比较生硬;后查询了很多材料,需要通过scipy的spline进行插值法处理,经过几天的反复测试,今天终于完全搞定了。

代码示例

  1. # coding:utf-8

  2. import pylab

  3. import numpy as np

  4. from matplotlib import pyplot as plt

  5. from matplotlib import cm

  6. from numpy import matrix

  7. from sklearn.feature_extraction.text import CountVectorizer

  8. from sklearn.feature_extraction.text import TfidfTransformer

  9. from scipy.interpolate import spline

  10. #文本词频可视化图表stackplot风格

  11. # streamgraph风格的在beaborn上也有,不过不太符合要求

  12. # streamgraph风格的在pyechart上也有,可以直接使用,下次再讲用法

  13. # streamgraph风格的在matplotlib上只有类stackplot,不够圆滑


  14. def draw_river(data,xlabels,ylabels,title='',step=300):

  15.    # X标签 行,即章节

  16.    # Y标签 列,即词汇

  17.    # 数据 即词频,需要转置后才能应用

  18.    #获取y轴数量

  19.    ylen=len(ylabels)

  20.    #初始化一个X轴的序列numpy数组,默认为[0 1 2 len(xlabel)]

  21.    initX = np.array(range(len(xlabels)))

  22.    #linspace用于创建一个是等差数列的一维数组,最小值是0,最大值是X轴长度,

  23.    xnew=np.linspace(initX.min(), initX.max(), step)

  24.    #创建一个numpy空的二维数组newdata,以便存储转换后的data

  25.    newdata=np.empty(shape=[0,step])

  26.    #spline只能应用于一维数组,所需需要分行读取

  27.    for datarow in range(ylen):

  28.        power_smooth = spline(initX, data[datarow], xnew)

  29.        #将一维numpy数组变为二维数据

  30.        middata = power_smooth[np.newaxis, :]

  31.        #将二维数组添加到最终的数组中

  32.        newdata=np.append(newdata,middata,axis=0)

  33.    pylab.mpl.rcParams['font.sans-serif'] = ['SimHei']  # 防止中文乱码

  34.    pylab.mpl.rcParams['axes.unicode_minus'] = False  # 防止中文乱码

  35.    fig, ax = plt.subplots()

  36.    #用stackplot绘制新的图形

  37.    ax.stackplot(xnew, newdata,labels=ylabels, baseline='wiggle')

  38.    ax.axes.set_yticks(range(len(ylabels)))

  39.    ax.axes.set_yticklabels(ylabels)

  40.    ax.axes.set_xticks(range(len(xlabels)))

  41.    ax.axes.set_xticklabels(xlabels)

  42.    ax.legend(loc='best')

  43.    ax.set_title(title)

  44.    plt.show()


  45. def draw_stackplot(data,xlabels,ylabels):

  46.    # X标签 行,即章节

  47.    # Y标签 列,即词汇

  48.    # 数据 即词频,需要转置后才能应用

  49.    #data= [[0, 3, 3, 3, 0, 0, 3, 0, 3], [0, 3, 0, 3, 0, 6, 3, 0, 3], [3, 0, 0, 0, 3, 0, 3, 3, 0], [0, 3, 3, 3, 0, 0, 3, 0, 3]]

  50.    #xlablels= range(0, 4)

  51.    #ylablels= ['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']

  52.    pylab.mpl.rcParams['font.sans-serif'] = ['SimHei']  # 防止中文乱码

  53.    pylab.mpl.rcParams['axes.unicode_minus'] = False  # 防止中文乱码

  54.    fig, ax = plt.subplots()

  55.    ax.stackplot(xlabels, data, labels=ylabels, baseline='wiggle')

  56.    ax.axes.set_yticks(range(len(ylabels)))

  57.    ax.axes.set_yticklabels(ylabels)

  58.    ax.axes.set_xticks(range(len(xlabels)))

  59.    ax.axes.set_xticklabels(xlabels)

  60.    ax.legend(loc='best')

  61.    ax.set_title('Interesting Graph\nCheck it out')

  62.    plt.show()


  63. #文本词频可视化图表heatmap风格

  64. def draw_heatmap(data, xlabels, ylabels):

  65.    pylab.mpl.rcParams['font.sans-serif'] = ['SimHei']  # 防止中文乱码

  66.    pylab.mpl.rcParams['axes.unicode_minus'] = False  # 防止中文乱码

  67.    vmin=np.amin(matrix(data))

  68.    vmax = np.amax(matrix(data))

  69.    cmap = cm.Blues

  70.    figure = plt.figure(facecolor='w')

  71.    ax = figure.add_subplot(2, 1, 1, position=[0.1, 0.15, 0.8, 0.8])

  72.    ax.set_yticks(range(len(ylabels)))

  73.    ax.set_yticklabels(ylabels)

  74.    ax.set_xticks(range(len(xlabels)))

  75.    ax.set_xticklabels(xlabels)

  76.    map = ax.imshow(data, interpolation='nearest', cmap=cmap, aspect='auto', vmin=vmin, vmax=vmax)

  77.    cb = plt.colorbar(mappable=map, cax=None, ax=None, shrink=0.5)

  78.    plt.xticks(rotation=90)  # 将字体进行旋转

  79.    plt.yticks(rotation=360)

  80.    plt.show()


  81. #------------------------------英文tf-idf-------------------------------

  82. #英文文本

  83. corpus = [

  84.    'This is the first document.'*3,

  85.    'This is the second second document.'*3,

  86.    'And the third one.'*3,

  87.    'Is this the first document?'*3,

  88. ]

  89. # -------------------------词频分析---------------------------

  90. #将文本中的词语转换为词频矩阵

  91. vectorizer = CountVectorizer()

  92. #计算个词语出现的次数

  93. X = vectorizer.fit_transform(corpus)

  94. #X格式如下,主要包括(行 词)词频

  95. #(0, 1)    1     (0, 2)   1     (0, 6)   1     (0, 3)   1     (0, 8)   1     (1, 5)   2     (1, 1)   1

  96. #获取语句中所有文本关键词

  97. word = vectorizer.get_feature_names()

  98. # word格式如下,是个英文词汇的数组列表

  99. # ['and', 'document', 'first', 'is', 'one', 'second', 'the', 'third', 'this']

  100. #查看词频结果,转置为Numpy 2维数组后的输出

  101. print('X.toarray()=',X.toarray())

  102. #and   document   first  is one    second the    third  this

  103. #0 1  1  1  0  0  1  0  1

  104. #0 1  0  1  0  2  1  0  1

  105. #1 0  0  0  1  0  1  1  0

  106. #0 1  1  1  0  0  1  0  1

  107. # ---------------------------可视化----------------------------

  108. #热力图方式

  109. xlabels=word

  110. ylabels=list(range(len(corpus)))

  111. data=X.toarray().tolist()

  112. draw_heatmap(data, xlabels, ylabels)


  113. #转置维stackflow的格式要求,y轴为字符,x轴为章节

  114. #stackplt方式

  115. data=X.T.toarray().tolist()

  116. draw_stackplot(data, ylabels, xlabels)

  117. draw_river(data,ylabels,xlabels,title='词云河流图',step=300)

关于词云可视化笔记五(tf-idf可视化之河流图)_其它

关于词云可视化笔记五(tf-idf可视化之河流图)_中文乱码_02