为了学习,我正在做一个单词云程序,它可以计算一个单词在文本中出现的次数,然后把它打印成一种“单词云”的图像。
程序运行良好,但我想解决一些美学问题,如:
1.如何删除x轴和y轴上的数字?
1.是否可以完全移除轴?
1.有时候一个单词会重叠在另一个单词上。有谁知道如何让单词不重叠,而是让单词彼此相邻?
打印输出为
...还有...
我希望它看起来像这样(或至少尽可能接近它)
问题代码为
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()
所有的帮助是欢迎和赞赏。
1条答案
按热度按时间k10s72fa1#
定义不带轴记号和标签的地物对象:
删除此行:
结束行:
为了使你的图看起来像你提供的例子…它需要大量的手动插拔,试验和错误,无论你想叫它;你必须为每个单词插入坐标,并决定你认为每个单词在x-y坐标中看起来最好的位置-一个技巧是最大的单词应该最后绘制(即当i == N - 1时),而最小的文本应该首先绘制(即当i == 0时);这样,较大的文本就不会有较小的文本覆盖它。你也可以专注于有足够距离的非重叠坐标,这样单词就不会太靠近彼此-或者,如果你想让单词接触,你可以调整它们彼此重叠的程度。有一个随机化RGB列表的色彩Map表,这样颜色就更“分散”了(而不是让所有的黄色文本在右上角例如)。也许中心的较大的文本和有较小的文本更多的外围。名单继续下去,但我想你得到的想法。