Мне нужно отобразить облако слов в моем приложении для тире. Согласно этой теме https : //community.plot.ly/t/solved-is-it-possible-to-make-a-wordcloud-in-dash/4565, в тире нет встроенного компонента wordcloud. Один из обходных путей - использовать модуль WordCloud для создания облака слов в виде изображения и использовать dash_html_components.Img для отображения в макете.

Я новичок в Dash. Не уверен, как я могу сделать изображение. Нужно ли сохранять Wordcloud как временное изображение каждый раз, когда я создаю Wordcloud?

Очень ценю, если кто-то с некоторым опытом в Dash может помочь с этим.

Код ниже:

import dash
import dash_core_components as dcc
import dash_html_components as html

print(dcc.__version__) # 0.6.0 or above is required

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

dfm = pd.DataFrame({'word': ['apple', 'pear', 'orange'], 'freq': [1,3,9]})

app.layout = html.Div([
    html.Img(id = 'image_wc')
])

# function to make wordcoud from word frequency dataframe
def plot_wordcloud (data):
        d = {}
        for a, x in data.values:
            d[a] = x
        wc = WordCloud(background_color='black',
                    width=1800,
                    height=1400).generate_from_frequencies(frequencies=d)   
        return (wc)

@app.callback(dash.dependencies.Output('image_wc', 'img'))
def make_image ():
    img = plot_wordcloud (data = dfm)
    return (img)


if __name__ == '__main__':
    app.run_server(debug=True)
6
zesla 18 Ноя 2019 в 07:08

1 ответ

Лучший ответ

Вот рабочий пример ниже. Он использует pip - устанавливаемую библиотеку wordcloud и передает PNG-представление результирующего изображения в кодировке base-64 через BytesIO, поэтому вам не нужно сбрасывать все созданные файлы PNG каждый время.

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

import dash
import dash.dependencies as dd
import dash_core_components as dcc
import dash_html_components as html

from io import BytesIO

import pandas as pd
from wordcloud import WordCloud
import base64

# external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__) #, external_stylesheets=external_stylesheets)

dfm = pd.DataFrame({'word': ['apple', 'pear', 'orange'], 'freq': [1,3,9]})

app.layout = html.Div([
    html.Img(id="image_wc"),
])

def plot_wordcloud(data):
    d = {a: x for a, x in data.values}
    wc = WordCloud(background_color='black', width=480, height=360)
    wc.fit_words(d)
    return wc.to_image()

@app.callback(dd.Output('image_wc', 'src'), [dd.Input('image_wc', 'id')])
def make_image(b):
    img = BytesIO()
    plot_wordcloud(data=dfm).save(img, format='PNG')
    return 'data:image/png;base64,{}'.format(base64.b64encode(img.getvalue()).decode())

if __name__ == '__main__':
    app.run_server(debug=True)
7
Randy 22 Ноя 2019 в 04:28