首页 > 解决方案 > 我怎样才能使这个 matplotlib“词云”图更好看?

问题描述

为了学习,我正在开发这个词云程序,它计算一个词在文本中出现的次数,并将其打印成一种“词云”图像。

该程序运行良好,但我想解决一些美学问题,例如:

  1. 如何删除 x 轴和 y 轴上的数字?
  2. 是否可以完全移除轴?
  3. 有时,一个词将自己置于另一个词之上。有谁知道如何使单词不相互打印并使单词彼此相邻?

打印出来的是 在此处输入图像描述

... 和...

我希望它看起来像这样(或尽可能接近它) 在此处输入图像描述

有问题的代码是

filename = "adventure.txt"
infile = open(filename)

wordcounts = {}

for line in infile:
    words = line.split()
    for word in words:
        w = "".join([e for e in word if e.isalpha()])
        w = w.lower()

        if w in wordcounts:
            wordcounts[w] = wordcounts[w] + 1
        else:
            wordcounts[w] = 1

#Put all words in list and sort counts
words = list(wordcounts.keys())                 
words.sort(key=lambda x:wordcounts[x], reverse=True)


import matplotlib.pyplot as plt
import numpy as np

#Set maximum fornt size to 50
scale = 50/wordcounts[words[1]]

#Set up empty plot with limits on x-axis and y-axis
plt.axes(xlim=(0,100), ylim=(0,100) )

#Plot 50 most frequent words with size=frequency

N = min(len(words), 50)
for i in range(0,N):
    x = np.random.uniform(0,90)
    y = np.random.uniform(0,90)
    freq = wordcounts[words[i]]
    col =["r", "g", "b", "m", "c", "k"][i % 5]
    plt.text(x, y, words[i], fontsize=scale * freq, color=col)
plt.show()

欢迎并感谢所有帮助。

标签: pythonmatplotlibgraphword-cloud

解决方案


定义不带坐标轴刻度和标签的图形对象:

fig = plt.figure(figsize = (10, 10), num = 1, clear = True)
ax = plt.subplot(1, 1, 1, xticks = [], yticks = [], frameon = False)

删除这一行:

plt.axes(xlim=(0,100), ylim=(0,100) )

结束语:

for i in range(0,N):
    x = np.random.uniform(0,90)
    y = np.random.uniform(0,90)
    freq = wordcounts[words[i]]
    col =["r", "g", "b", "m", "c", "k"][i % 5]
    ax.text(x, y, words[i], fontsize=scale * freq, color=col)
plt.show()

为了使您的情节看起来与您提供的示例相似……无论您想怎么称呼它,都需要进行大量的手动插拔,反复试验;您必须为每个单词插入坐标,并确定您认为每个单词在 xy 坐标方面看起来最好的位置——一个提示是应该最后绘制最大的单词(即当 i == N - 1 时),而应该首先绘制最小的文本(即当 i == 0 时);这样,较大的文本将不会覆盖较小的文本。您还可以专注于具有足够距离的非重叠坐标,以使单词彼此之间不会太近 - 或者,如果您希望单词相互接触,您可以缩放它们重叠的程度一个其他。有一个随机化 RGB 列表的颜色图,以便颜色更“


推荐阅读