Бок о бок Wordclouds в matplotlib

Я использую пакет WordCloud для отображения слов, сгенерированных scikit LDA (скрытое распределение Дирихле). Для каждой темы, созданной LDA, у меня будет диаграмма. Я хочу иметь возможность отображать все диаграммы в сетке, чтобы визуализировать их рядом. По сути, у меня есть функция, которая принимает модель LDA в качестве входных данных вместе с темой LDA, которую я хочу визуализировать, а затем строит облако слов:

from wordcloud import WordCloud
import matplotlib.pyplot as plt
SEED=0

def topicWordCloud(model, topicNumber, WCmaxWords,WCwidth, WCheight):
    topic = model.components_[topicNumber]
    tupleList = [(tf_feature_names[i],int(topic[i]/topic.sum()*10000)) for i in range(len(topic))]
    wordcloud = WordCloud(width=WCwidth, height=WCheight, max_words=WCmaxWords, random_state=42).generate_from_frequencies(tupleList)
    plt.figure( figsize=(20,10) )
    plt.imshow(wordcloud)
    plt.axis("off")

topicWordCloud(model=lda, topicNumber=2, WCmaxWords=100,WCwidth=800, WCheight=600)

Как просмотреть все мои темы (n_topics), чтобы визуализировать все диаграммы в виде сетки? Я думал что-то вроде:

fig = plt.figure()
for i in range(n_topics):
    plt.subplot(2,1,i+1) 
    #something here

person ADJ    schedule 08.12.2015    source источник


Ответы (1)


Верните wordcloud из своей функции, затем вызовите topicWordCloud из цикла for. Затем используйте imshow для Axes, созданного с помощью fig.add_subplot. Например, что-то вроде этого:

def topicWordCloud(model, topicNumber, WCmaxWords,WCwidth, WCheight):
    topic = model.components_[topicNumber]
    tupleList = [(tf_feature_names[i],int(topic[i]/topic.sum()*10000)) for i in range(len(topic))]
    wordcloud = WordCloud(width=WCwidth, height=WCheight, max_words=WCmaxWords, random_state=42).generate_from_frequencies(tupleList)
    return wordcloud

fig = plt.figure()
for i in range(n_topics):
    ax = fig.add_subplot(2,1,i+1)
    wordcloud = topicWordCloud(...)

    ax.imshow(wordcloud)
    ax.axis('off')
person tmdavison    schedule 08.12.2015