【发布时间】:2018-10-08 13:19:16
【问题描述】:
我是 flask 和 python 的新手,我正在创建一个项目,该项目可以提取 Twitter 数据,以使用 TextBlob 对搜索词进行情绪分析,以显示一些视觉统计数据。我已将一些统计数据保存为变量(正面、负面和中性推文的百分比),并试图将它们传递给函数以生成饼图。此函数经过修饰,以便将生成的 PNG 文件传递给 HTML 页面。我似乎在将这些变量传递到我的绘图函数中时遇到问题。
这是我的情绪分析的一部分:
def sentiment(userinput):
# creating object of TwitterClient Class
api = TwitterClient(userinput)
# calling function to get tweets
#searchterm = input("Enter query: ")
tweets = api.get_tweets(query=api.searchterm, count=10)
# picking positive tweets from tweets
ptweets = [tweet for tweet in tweets if tweet['sentiment'] == 'positive']
# percentage of positive tweets
ptweet_analyses_pie = 100 * len(ptweets) / len(tweets)
# picking negative tweets from tweets
ntweets = [tweet for tweet in tweets if tweet['sentiment'] == 'negative']
# percentage of negative tweets
ntweets_analyses_pie = (100 * len(ntweets) / len(tweets))
# percentage of neutral tweets
#leftoverTweets = tweets - ntweets - ptweets
nut_tweet_analyses_pie = (100 * (len(tweets) - len(ntweets) - len(ptweets)) / len(tweets))
pie_chart_img = pie_chart(ptweet_analyses_pie, nut_tweet_analyses_pie, ntweets_analyses_pie)
return ptweets, ntweets, ptweet_analyses, ntweets_analyses, nut_tweet_analyses, pie_chart_img
这里是调用sentiment()的地方:
@app.route('/render_Data', methods = ['GET', 'POST'])
def render_Data():
if request.method == 'POST':
tweets=request.form['tweets']
ptweets, ntweets, ptweet_analyses, ntweets_analyses, nut_tweet_analyses, pie_chart_img = sentiment(tweets)
return render_template('render_Data.html', ptweets = ptweets, ntweets = ntweets, ptweet_analyses = ptweet_analyses,
ntweets_analyses = ntweets_analyses, nut_tweet_analyses = nut_tweet_analyses, pie_chart_img = pie_chart_img)
这里是我制作 pie_chart.png 并给它一个 url 以呈现为 html 而不保存到静态的地方。
@app.route('/pie_chart.png')
def pie_chart(x,y,z):
labels = 'Positive', 'Negative', 'Neutral'
sizes = [x,y,z]
colors = ['gold', 'pink', 'lightskyblue']
explode = (0, 0, 0) # explode 1st slice
# Plot
plt.axis('equal')
plt.pie(sizes, explode=explode, labels=labels, colors=colors,
autopct='%1.1f%%', shadow=True, startangle=140)
img = BytesIO()
plt.savefig(img)
response = make_response(img.getvalue())
response.mimetype = 'image/png'
return response
最后是 HTML:
<img src='{{url_for('pie_chart')}}'>
不幸的是,当我尝试渲染结果时出现错误:pie_chart() 缺少 3 个必需的位置参数:“x”、“y”和“z”
提前致谢!我知道我的代码有点初级,因为我仍处于编码的初级阶段,所以请在你的回复中放轻松!
【问题讨论】:
-
只是一个想法,您是否想使用谷歌图表来可视化您模板上的饼图,我认为它可能会给您带来更多的优雅和灵活性。如果你这样做了,你只需要将数字传递给你的模板,然后 js 处理显示图表。如果你这样做,我可以提供一个工作示例,上面有你的代码
-
感谢摩西的回复!不幸的是,我的团队成员坚持使用 matplotlib。我没想过要使用谷歌图表,但我花了一秒钟来检查它们。我同意它们确实看起来更干净、更优雅。我期待在其他项目上与他们合作。
标签: python-3.x flask tweepy textblob