Есть ли способ сделать разные аннотации на фигуре matplotlib с разными размерами шрифта? - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь аннотировать 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() 

С этим кодом вывод дает: enter image description here

Как видите, серые sh слова за их эквивалентом в WordCloud не соответствуют их размеру шрифта. (Хотя я не совсем уверен, почему происходит вращение.) тот же размер шрифта.

Надеюсь, я понял свою проблему здесь, насколько я видел, не так много других случаев, когда у людей возникает такая же проблема ( Различные размеры шрифта в той же аннотации matplotlib? - единственный, который я смог найти, и они не нашли решения)

Итак, если бы кто-то мог просветить меня относительно того, почему происходит эта перезапись, как я могу ее преодолеть или даже другое классы в matplotlib, которые могли бы помочь в этом случае, мы будем очень признательны.

...