Я пытаюсь аннотировать URL-адреса за построенным WordCloud, где каждое слово в облаке имеет невидимую аннотацию, соответствующую самому себе во всех отношениях (шрифт, размер шрифта, расположение, поворот), которая при нажатии приводит к уникальному URL-адресу, установленному в аннотации функция.
Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я вызываю annotate()
, он перезаписывает размер шрифта для ранее нанесенных аннотаций, так что после того, как я нанесу все 15 слов в WordCloud, все слова будут просто тот же размер.
Я нашел AnchoredText
, который, кажется, сохраняет свой уникальный размер шрифта для нескольких вызовов, но ему не хватает полной настройки местоположения, поскольку он ограничен 10 кодами местоположения. Насколько я смог найти, вы не можете ввести конкретную точку c в графике для этого AnchoredText в go, как вы можете с annotation()
.
В приведенном ниже коде вы заметите, что расположение и размеры шрифта масштабируются на определенные значения. По какой-то причине координаты местоположения для слов, созданных в wordcloud.layout_
, не эквивалентны тем же координатам на графике. В любом случае эти скаляры, которые я нашел, достаточно хорошо выстраивают слова для моего случая.
Вот что у меня есть:
### word_cloud is a string containing all occurrences of my words to create the WordCloud
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from IPython.display import set_matplotlib_formats
from matplotlib import font_manager as fm, rcParams
### create WordCloud object
wordcloud = WordCloud(background_color = 'white',width=800, height=800, max_words=15).generate(word_cloud)
layout = wordcloud.layout_
### Plot annotations for each word in WordCloud (top 15)
def plot_links(layout,prop):
for x in range(0,15):
if layout[x][3] == None:
text = plt.gca().annotate(layout[x][0][0], xy=layout[x][2][::-1],
xytext=(layout[x][2][::-1][0],layout[x][2][::-1][1] + (layout[x][1] / 1.3)),
url='http://matplotlib.org', bbox=dict(color='w', alpha=0.01, url='http://matplotlib.org'),
size = (layout[x][1] / 1.85),alpha = 0.1,fontproperties = prop)
else:
text = plt.gca().annotate(layout[x][0][0], xy=layout[x][2][::-1],
xytext=(layout[x][2][::-1][0],layout[x][2][::-1][1] + (layout[x][1] / 1.3)),
url='http://matplotlib.org', bbox=dict(color='w', alpha=0.01, url='http://matplotlib.org'),
size = (layout[x][1] / 1.85),alpha = 0.1,fontproperties = prop, rotation = 270)
print("Size: ",layout[x][1],"\nText: ",layout[x][0][0],"\nLocation",layout[x][2])
### same font as WordCloud
prop = fm.FontProperties(fname='DroidSansMono.ttf',stretch = 1000)
set_matplotlib_formats("svg")
plt.figure()
plt.imshow(wordcloud, interpolation="bilinear")
plot_links(layout,prop)
plt.axis("off")
plt.margins(x=0, y=0)
plt.show()
С этим кодом вывод дает:
Как видите, серые sh слова за их эквивалентом в WordCloud не соответствуют их размеру шрифта. (Хотя я не совсем уверен, почему происходит вращение.) тот же размер шрифта.
Надеюсь, я понял свою проблему здесь, насколько я видел, не так много других случаев, когда у людей возникает такая же проблема ( Различные размеры шрифта в той же аннотации matplotlib? - единственный, который я смог найти, и они не нашли решения)
Итак, если бы кто-то мог просветить меня относительно того, почему происходит эта перезапись, как я могу ее преодолеть или даже другое классы в matplotlib, которые могли бы помочь в этом случае, мы будем очень признательны.