前面三篇文章《使用python機(jī)器學(xué)習(xí)(一)》、《使用python機(jī)器學(xué)習(xí)(二)》内狗、《使用python機(jī)器學(xué)習(xí)(三)》分別介紹了numpy、scipy赂鲤、pandas的簡單使用梗顺。
學(xué)習(xí)matplotlib時(shí)仑鸥,找到了使用Pandas和Matplotlib分析Tweets這篇文章,在此對其轉(zhuǎn)載,歡迎大家學(xué)習(xí)誊役。文中涉及代碼
github路徑在此
Python有多種可視化庫,包括seaborn, networkx, 和vispy。大多數(shù)的Python可視化庫全部或部分基于matplotlib艺玲,這往往是繪制簡單的圖的第一種手段搁拙,也是繪制那些難以在其他庫繪制的圖的最后一種手段朋譬。
在這個(gè)matplotlib教程中,我們將介紹該庫的基本知識犀忱,并看看如何進(jìn)行一些中間可視化。
我們將使用包含將近240,000條關(guān)于Hillary Clinton, Donald Trump, 和Bernie Sanders搀庶,目前所有美國總統(tǒng)候選人的推特的數(shù)據(jù)集。
該數(shù)據(jù)是從Twitter Streaming API拉過來的铜异,而所有240,000條推特的csv文件可以在這里下載哥倔。如果你想自己爬取更多數(shù)據(jù),那么你可以看看這里的爬蟲代碼揍庄。
使用Pandas探索Tweets
在我們開始繪制之前咆蒿,讓我們加載數(shù)據(jù)并進(jìn)行一些探索。我們可以使用Pandas蚂子,這個(gè)數(shù)據(jù)分析Python庫蒂破,來幫助我們。在下面的代碼中攀甚,我們將:
- 導(dǎo)入Pandas庫。
- 讀取
tweets.csv
到一個(gè)Pandas DataFrame種。 - 打印出該DataFrame的前
5
行。
import pandas as pd
tweets = pd.read_csv("tweets.csv")
tweets.head()
| id | id_str | user_location | user_bg_color | retweet_count | user_name | polarity | created | geo | user_description | user_created | user_followers | coordinates | subjectivity | text
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---
0 | 1 | 729828033092149248 | Wheeling WV | 022330 | 0 | Jaybo26003 | 0.00 | 2016-05-10T00:18:57 | NaN | NaN | 2011-11-17T02:45:42 | 39 | NaN | 0.0 | Make a difference vote! WV Bernie Sanders Coul...
1 | 2 | 729828033092161537 | NaN | C0DEED | 0 | brittttany_ns | 0.15 | 2016-05-10T00:18:57 | NaN | 18 // PSJAN | 2012-12-24T17:33:12 | 1175 | NaN | 0.1 | RT @HlPHOPNEWS: T.I. says if Donald Trump wins...
2 | 3 | 729828033566224384 | NaN | C0DEED | 0 | JeffriesLori | 0.00 | 2016-05-10T00:18:57 | NaN | NaN | 2012-10-11T14:29:59 | 42 | NaN | 0.0 | You have no one to blame but yourselves if Tru...
3 | 4 | 729828033893302272 | global | C0DEED | 0 | WhorunsGOVs | 0.00 | 2016-05-10T00:18:57 | NaN | Get Latest Global Political news as they unfold | 2014-02-16T07:34:24 | 290 | NaN | 0.0 | 'Ruin the rest of their lives': Donald Trump c...
4 | 5 | 729828034178482177 | California, USA | 131516 | 0 | BJCG0830 | 0.00 | 2016-05-10T00:18:57 | NaN | Queer Latino invoking his 1st amendment privil... | 2009-03-21T01:43:26 | 354 | NaN | 0.0 | RT @elianayjohnson: Per source, GOP megadonor ...
下面是該數(shù)據(jù)中重要列的簡要說明:
-
id
– 在數(shù)據(jù)庫中行的id(這并不重要)。 -
id_str
– Twitter上推特的id。 -
user_location
– 推特用戶在他們的Twitter信息中指定的位置璃饱。 -
user_bg_color
– 推特用戶簡介的背景色。 -
user_name
– 推特用戶的Twitter用戶名呻畸。 -
polarity
– 推特的情感爽醋,從-1
到1
。1
表示非常積極爹殊,-1
表示非常消極父虑。 -
created
– 推特發(fā)送時(shí)間 -
user_description
– 推特用戶在其簡介中指定的描述括细。 -
user_created
– 推特賬號創(chuàng)建時(shí)間。 -
user_follower
– 該推特的關(guān)注人數(shù)邑贴。 -
text
– 推特的文本。 -
subjectivity
– 推特的主觀性和客觀性。0
表示非常可觀合是,1
表示非常主觀。
生成候選人列
我們可以用這個(gè)數(shù)據(jù)集進(jìn)行的最有趣的事情包括赖条,比較關(guān)于一個(gè)候選人的推特和另一個(gè)候選人的推特。例如,我們可以比較關(guān)于Donald Trump的推特的客觀性和關(guān)于Bernie Sanders的推特的客觀性纬乍。
為了完成這個(gè)任務(wù)碱茁,我們首先需要生成一個(gè)列,該列表示每條推特提到了哪個(gè)候選人仿贬。在下面的代碼中纽竣,我們將:
- 創(chuàng)建一個(gè)函數(shù),查找在一段文字中茧泪,哪個(gè)候選人的名字出現(xiàn)了蜓氨。
- 在DataFrames之上使用apply方法來生成一個(gè)名為
candidate
的新列,該列包括該推特提到了哪個(gè)(些)候選人调炬。
def get_candidate(row):
candidates = []
text = row["text"].lower()
if "clinton" in text or "hillary" in text:
candidates.append("clinton")
if "trump" in text or "donald" in text:
candidates.append("trump")
if "sanders" in text or "bernie" in text:
candidates.append("sanders")
return ",".join(candidates)
tweets["candidate"] = tweets.apply(get_candidate,axis=1)
繪制第一張圖
現(xiàn)在语盈,我們準(zhǔn)備好了。我們已經(jīng)準(zhǔn)備好使用matplotlib繪制第一張圖缰泡。在matplotlib中刀荒,繪制一張圖包括:
由于其靈活性泼返,你可以在matplotlib中把多個(gè)圖繪制在一張圖片中。每一個(gè)Axes對象表示一張圖姨拥,例如一個(gè)柱狀圖或直方圖绅喉。
這可能聽起來很復(fù)雜,但是matplotlib具有一些方便的方法叫乌,可以為我們完成建立一個(gè)Figure和Axes對象的工作柴罐。
導(dǎo)入matplotlib
為了使用matplotlib,首先憨奸,你講需要使用import matplotlib.pyplot as plt
導(dǎo)入該庫革屠。如果你正使用Jupyter notebook,從而在該notebook內(nèi)部設(shè)置使用matplotlib排宰。
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
我們導(dǎo)入matplotlib.pyplot
似芝,因?yàn)檫@包含matplotlib的繪圖函數(shù)。為了方便板甘,我們重命名它為plt
党瓮,因此可以更快繪圖。
繪制柱狀圖
一旦我們導(dǎo)入了matplotlib盐类,我們就可以繪制一張關(guān)于每個(gè)候選人被提到的推特?cái)?shù)的柱狀圖寞奸。為了完成這點(diǎn)痕寓,我們將:
- 使用Pandas Series上的value_counts函數(shù)來統(tǒng)計(jì)每個(gè)候選人有多少條提及他的推特。
- 使用
plt.bar
來創(chuàng)建一個(gè)柱狀圖蝇闭。我們將傳遞取值從0
到candidate
列的唯一值數(shù)目的數(shù)字列表,作為x軸輸入硬毕,把計(jì)數(shù)當(dāng)成y軸輸入呻引。 - 顯示計(jì)數(shù),從而我們擁有更多關(guān)于每一個(gè)柱子表示什么的上下文信息吐咳。
counts = tweets["candidate"].value_counts()
plt.bar(range(len(counts)), counts)
plt.show()
print(counts)
trump 119998
clinton,trump 30521
25429
sanders 25351
clinton 22746
clinton,sanders 6044
clinton,trump,sanders 4219
trump,sanders 3172
Name: candidate, dtype: int64
關(guān)于Trump的推特比關(guān)于Sanders或者Clinton的推特多得驚人逻悠!
你可能注意到,我們并沒有創(chuàng)建Figure或者任何Axes對象韭脊。這是因?yàn)檎{(diào)用plt.bar
會自動設(shè)置一個(gè)Figure和一個(gè)Axes對象童谒,表示該柱狀圖。調(diào)用plt.show方法會顯示當(dāng)前圖表中的任何東西沪羔。在這種情況下饥伊,它顯示一個(gè)包含了一個(gè)柱狀圖的圖像。
在pyplot模塊中蔫饰,matplotlib有一些方法可以使得創(chuàng)建常見類型的圖更快和更方便琅豆,因?yàn)樗鼈冏詣觿?chuàng)建一個(gè)Figure和一個(gè)Axes對象。最廣泛使用的是:
- plt.bar – 創(chuàng)建一個(gè)柱狀圖篓吁。
- plt.boxplot – 創(chuàng)建一個(gè)盒形圖和須狀圖茫因。
- plt.hist – 創(chuàng)建一個(gè)直方圖。
- plt.plot – 創(chuàng)建一個(gè)線條圖杖剪。
- plt.scatter – 創(chuàng)建一個(gè)散點(diǎn)圖冻押。
調(diào)用任意這些方法將自動設(shè)置Figure和Axes對象,并且繪制圖盛嘿。這些方法的每一個(gè)都有不同的參數(shù)洛巢,可以傳遞它們來修改效果圖。
自定義圖
現(xiàn)在孩擂,我們已經(jīng)有了第一個(gè)基本的圖狼渊,可以繼續(xù)創(chuàng)建第二個(gè)更個(gè)性化的圖了。我們會繪制一張基本的直方圖类垦,然后修改它狈邑,以添加標(biāo)簽及其他信息。
我們可以看的事情之一就是發(fā)推特的用戶賬號年齡蚤认。我們可以找到發(fā)關(guān)于Trump的推特的用戶賬號和發(fā)關(guān)于Clinton的推特的用戶賬號的創(chuàng)建時(shí)間之間是否有區(qū)別米苹。擁有更多最近創(chuàng)建的用戶賬號的候選人可能意味著使用假賬號進(jìn)行某種Twitter操縱。
在下面的代碼中砰琢,我們會:
- 將
created
和user_created
列轉(zhuǎn)換成Pandas datetime類型蘸嘶。 - 創(chuàng)建一個(gè)
user_age
列良瞧,表示從該賬號創(chuàng)建后至今的天數(shù)。 - 創(chuàng)建用戶年齡直方圖训唱。
- 顯示該直方圖褥蚯。
from datetime import datetime
tweets["created"] = pd.to_datetime(tweets["created"])
tweets["user_created"] = pd.to_datetime(tweets["user_created"])
tweets["user_age"] = tweets["user_created"].apply(lambda x: (datetime.now() - x).total_seconds() / 3600 / 24 / 365)
plt.hist(tweets["user_age"])
plt.show()
添加標(biāo)簽
我們可以添加標(biāo)題和軸標(biāo)簽到matplotlib圖中。完成這件事的通用方法是:
- plt.title – 添加標(biāo)題到圖上况增。
- plt.xlabel – 添加x軸標(biāo)簽赞庶。
- plt.ylabel – 添加y軸標(biāo)簽。
由于我們之前討論到的所有方法澳骤,像bar
和hist
歧强,都會在figure中自動創(chuàng)建一個(gè)Figure和一個(gè)Axes對象,因此當(dāng)調(diào)用該方法時(shí)为肮,這些標(biāo)簽將會被添加到Axes對象上摊册。
我們可以用上面的方法添加標(biāo)簽到我們之前的直方圖上。在下面的代碼中颊艳,我們會:
- 生成我們之前完成的相同的直方圖茅特。
- 畫一個(gè)標(biāo)題到該直方圖。
- 畫一個(gè)x軸標(biāo)簽到該直方圖上籽暇。
- 畫一個(gè)y軸標(biāo)簽到該直方圖上温治。
- 顯示該圖。
plt.hist(tweets["user_age"])
plt.title("Tweets mentioning candidates")
plt.xlabel("Twitter account age in years")
plt.ylabel("# of tweets")
plt.show()
繪制疊加柱狀圖
現(xiàn)在的直方圖可以很好的告訴我們所有的推特賬戶的注冊年齡戒悠,但是它并沒有根據(jù)候選人進(jìn)行分類熬荆,這可能會更有趣。我們可以在hist
放中添加額外的選項(xiàng)绸狐,以創(chuàng)建一個(gè)疊加柱狀圖卤恳。
在下面的代碼中,我們會:
- 生成三個(gè)Pandas series寒矿,每個(gè)只包含關(guān)于某個(gè)特定的候選人的推特的
user_age
數(shù)據(jù)突琳。 - 通過調(diào)用
hist
方法,并添加額外的選項(xiàng)創(chuàng)建一個(gè)疊加直方圖符相。- 指定一個(gè)列表作為輸入將繪制三組柱狀圖拆融。
- 指定
stacked=True
將疊加這三個(gè)條的集合。 - 增加
label
選項(xiàng)將為圖例生成正確的標(biāo)簽啊终。
- 調(diào)用plt.legend方法來在右上角繪制一個(gè)圖例镜豹。
- 添加標(biāo)題,x軸和y軸標(biāo)簽蓝牲。
- 顯示該圖趟脂。
cl_tweets = tweets["user_age"][tweets["candidate"] == "clinton"]
sa_tweets = tweets["user_age"][tweets["candidate"] == "sanders"]
tr_tweets = tweets["user_age"][tweets["candidate"] == "trump"]
plt.hist([
cl_tweets,
sa_tweets,
tr_tweets
],
stacked=True,
label=["clinton", "sanders", "trump"]
)
plt.legend()
plt.title("Tweets mentioning each candidate")
plt.xlabel("Twitter account age in years")
plt.ylabel("# of tweets")
plt.show()
注釋直方圖
我們可以利用matplotlibs在圖上繪制文本的能力來添加注釋。注釋指向圖表的特定部分例衍,讓我們一個(gè)片段來描述一些東東昔期。
在下面的代碼中已卸,我們會創(chuàng)建和上面一樣的直方圖,但是會調(diào)用plt.annotate方法來添加注釋到圖中硼一。
plt.hist([
cl_tweets,
sa_tweets,
tr_tweets
],
stacked=True,
label=["clinton", "sanders", "trump"]
)
plt.legend()
plt.title("Tweets mentioning each candidate")
plt.xlabel("Twitter account age in years")
plt.ylabel("# of tweets")
plt.annotate('More Trump tweets', xy=(1, 35000), xytext=(2, 35000),
arrowprops=dict(facecolor='black'))
plt.show()
下面是傳給annotate
的選項(xiàng)的行為描述:
-
xy
– 確定x
和y
坐標(biāo)中箭頭應(yīng)該從哪里開始累澡。 -
xytext
– 確定x
和y
坐標(biāo)中文本應(yīng)該從哪里開始。 -
arrowprops
– 指定箭頭相關(guān)的選項(xiàng)般贼,例如顏色永乌。
正如你所見的,關(guān)于Trump的推特明顯比其他候選人更多具伍,但是在賬號注冊年齡上,看不出顯著的差異圈驼。
多個(gè)子圖
目前為止人芽,我們使用了一些方法,像plt.bar
和plt.hist
绩脆,它們會自動創(chuàng)建一個(gè)Figure對象和一個(gè)Axes對象萤厅。然而,當(dāng)我們想獲得關(guān)于圖的更多控制時(shí)靴迫,我們可以顯式創(chuàng)建這些對象惕味。我們可能想要更多控制的場景之一是,當(dāng)我們想要在同張圖上并排放置多個(gè)圖表玉锌。
通過調(diào)用plt.subplots方法名挥,我們可以生成一個(gè)Figure和多個(gè)Axes對象。傳遞兩個(gè)參數(shù)主守,nrows
和ncols
禀倔,它們定義在Figure中Axes對象的布局。例如参淫,plt.subplots(nrows=2, ncols=2)
會生成2x2
網(wǎng)格的Axes對象救湖。plt.subplots(nrows=2, ncols=1)
會生成2x1
網(wǎng)格的Axes對象,然后將這兩個(gè)Axes對象垂直堆積在一起涎才。
每個(gè)Axes對象支持pyplot
中的大多數(shù)方法鞋既。例如,我們可以在一個(gè)Axes對象上調(diào)用bar
方法來生成一個(gè)柱狀圖耍铜。
提取顏色
我們將生成4
張圖邑闺,用來那些發(fā)關(guān)于Trump推特的用戶的Twitter背景色中的紅色和藍(lán)色的數(shù)量。這可能顯示业扒,確定為共和黨派的推特用戶是否更傾向于在他們的個(gè)人資料中使用紅色检吆。
首先,我們要生成兩列程储,red
和blue
蹭沛,用來表示在每個(gè)推特用戶的個(gè)人資料背景中臂寝,每種顏色的多少,從0
到1
摊灭。
在下面的代碼中咆贬,我們將:
- 使用
apply
方法來遍歷user_bg_color
列中的每一行,然后提取其中的紅色總數(shù)帚呼。 - 使用
apply
方法來遍歷user_bg_color
列中的每一行掏缎,然后提取其中的藍(lán)色總數(shù)。
import matplotlib.colors as colors
tweets["red"] = tweets["user_bg_color"].apply(lambda x: colors.hex2color('#{0}'.format(x))[0])
tweets["blue"] = tweets["user_bg_color"].apply(lambda x: colors.hex2color('#{0}'.format(x))[2])
創(chuàng)建圖
一旦我們擁有了數(shù)據(jù)煤杀,我們就可以創(chuàng)建圖眷蜈。每張圖將會是一個(gè)直方圖,用以顯示個(gè)人資料背景包含特定數(shù)量的藍(lán)色或紅色的推特用戶數(shù)沈自。
在下面的代碼中酌儒,我們:
- 使用
subplots
方法生成一個(gè)Figure和多個(gè)Axes。Axes將作為數(shù)組返回枯途。 - Axes在一個(gè)2x2 NumPy數(shù)組中返回忌怎。通過使用數(shù)組的flat屬性,提取每個(gè)Axes對象酪夷。這為我們提供了
4
個(gè)Axes對象用以工作榴啸。 - 使用hist方法在第一個(gè)Axes中繪制一個(gè)直方圖。
- 使用set_title方法晚岭,設(shè)置第一個(gè)Axes的標(biāo)題為
Red in all backgrounds
鸥印。這與plt.title
功能一致。 - 使用hist方法在第二個(gè)Axes中繪制一個(gè)直方圖坦报。
- 使用set_title方法辅甥,設(shè)置第二個(gè)Axes的標(biāo)題為
Red in Trump tweeters
。 - 使用hist方法在第三個(gè)Axes中繪制一個(gè)直方圖燎竖。
- 使用set_title方法璃弄,設(shè)置第三個(gè)Axes的標(biāo)題為
Blue in all backgrounds
。這與plt.title
功能一致构回。 - 使用hist方法在第四個(gè)Axes中繪制一個(gè)直方圖夏块。
- 使用set_title方法,設(shè)置第四個(gè)Axes標(biāo)題為
Blue in Trump tweeters
纤掸。 - 調(diào)用plt.tight_layout方法來減少圖間的填充并調(diào)整所有元素脐供。
- 顯示該圖。
fig, axes = plt.subplots(nrows=2, ncols=2)
ax0, ax1, ax2, ax3 = axes.flat
ax0.hist(tweets["red"])
ax0.set_title('Red in backgrounds')
ax1.hist(tweets["red"][tweets["candidate"] == "trump"].values)
ax1.set_title('Red in Trump tweeters')
ax2.hist(tweets["blue"])
ax2.set_title('Blue in backgrounds')
ax3.hist(tweets["blue"][tweets["candidate"] == "trump"].values)
ax3.set_title('Blue in Trump tweeters')
plt.tight_layout()
plt.show()
移除共同的背景色
Twitter有默認(rèn)的個(gè)人資料背景顏色借跪,我們或許應(yīng)該移除它政己,這樣才能通過消除噪音,以生成一個(gè)更準(zhǔn)確的圖掏愁。該演示是十六進(jìn)制格式的歇由,其中卵牍,#000000
是黑色,而#ffffff
是白色沦泌。
下面是如何查找背景顏色中的最常見的顏色:
tweets["user_bg_color"].value_counts()
C0DEED 108977
000000 31119
F5F8FA 25597
131516 7731
1A1B1F 5059
022330 4300
0099B9 3958
現(xiàn)在糊昙,我們可以刪除三種最常見的顏色,然后只畫出那些有唯一背景顏色的用戶谢谦。下面的代碼大多數(shù)我們之前做過的释牺,但是我們會:
- 從
user_bg_color
中移除C0DEED
,000000
, 和F5F8FA
。 - 創(chuàng)建一個(gè)函數(shù)回挽,不在最后一個(gè)圖表中繪制邏輯没咙。
- 繪制和前面
4
個(gè)圖一樣的圖,除了user_bg_color
中最常見的顏色千劈。
tc = tweets[~tweets["user_bg_color"].isin(["C0DEED", "000000", "F5F8FA"])]
def create_plot(data):
fig, axes = plt.subplots(nrows=2, ncols=2)
ax0, ax1, ax2, ax3 = axes.flat
ax0.hist(data["red"])
ax0.set_title('Red in backgrounds')
ax1.hist(data["red"][data["candidate"] == "trump"].values)
ax1.set_title('Red in Trump tweets')
ax2.hist(data["blue"])
ax2.set_title('Blue in backgrounds')
ax3.hist(data["blue"][data["candidate"] == "trump"].values)
ax3.set_title('Blue in Trump tweeters')
plt.tight_layout()
plt.show()
create_plot(tc)
正如你所看到的镜撩,發(fā)布關(guān)于Trump的推特的用戶的背景顏色中,紅色和藍(lán)色的分布幾乎與所有推特用戶的分布相同队塘。
繪制情緒
我們使用TextBlob,為每條推特生成情緒分值宜鸯,存儲在polarity
列中憔古。我們可以為每個(gè)候選人繪制平均值以及標(biāo)準(zhǔn)偏差。標(biāo)準(zhǔn)偏差將會告訴我們在所有的推特之間淋袖,變化有多寬鸿市,而平均值將會告訴我們平均推特是什么樣子的。
要這樣做即碗,我們可以添加2個(gè)Axes到單個(gè)Figure上焰情,然后在一個(gè)中繪制polarity
平均值,在另一個(gè)中繪制標(biāo)準(zhǔn)偏差剥懒。由于在這些圖中内舟,有大量的文本標(biāo)簽,因此我們將需要增加生成的圖像的大小來匹配初橘。我們可以使用plt.subplots
方法中的figsize
選項(xiàng)來做到這點(diǎn)验游。
下面的代碼將會:
- 根據(jù)候選人將推特進(jìn)行分組,對于每個(gè)數(shù)值列(包括
polarity
)保檐,計(jì)算平均值和標(biāo)準(zhǔn)方差耕蝉。 - 創(chuàng)建一個(gè)
7
x7
英寸的Figure,帶2個(gè)Axes對象夜只,垂直排列垒在。 - 在第一個(gè)Axes對象上創(chuàng)建標(biāo)準(zhǔn)偏差的柱狀圖。
- 使用set_xticklabels方法設(shè)置刻度標(biāo)記扔亥,使用
rotation
參數(shù)旋轉(zhuǎn)標(biāo)簽45
度场躯。 - 設(shè)置標(biāo)題谈为。
- 使用set_xticklabels方法設(shè)置刻度標(biāo)記扔亥,使用
- 在第二個(gè)Axes對象上創(chuàng)建均值的柱狀圖。
- 設(shè)置刻度標(biāo)記推盛。
- 設(shè)置標(biāo)題峦阁。
- 顯示該圖。
gr = tweets.groupby("candidate").agg([np.mean, np.std])
fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(7, 7))
ax0, ax1 = axes.flat
std = gr["polarity"]["std"].iloc[1:]
mean = gr["polarity"]["mean"].iloc[1:]
ax0.bar(range(len(std)), std)
ax0.set_xticklabels(std.index, rotation=45)
ax0.set_title('Standard deviation of tweet sentiment')
ax1.bar(range(len(mean)), mean)
ax1.set_xticklabels(mean.index, rotation=45)
ax1.set_title('Mean tweet sentiment')
plt.tight_layout()
plt.show()
生成并排條形圖
我們可以使用柱狀圖繪制根據(jù)候選人分組的推特長度耘成。首先將推特分成short
, medium
, 和long
推特榔昔。然后計(jì)算提到每個(gè)候選人的推特落到每個(gè)組的個(gè)數(shù)。接著瘪菌,生成并排每個(gè)候選人的條的柱狀圖撒会。
生成tweet長度
要繪制推特長度,我們首先必須對這些推特進(jìn)行分類师妙,然后找出關(guān)于每個(gè)候選人的推特落入到每個(gè)箱中的個(gè)數(shù)诵肛。
下面的代碼中,我們將:
- 定義一個(gè)函數(shù)默穴,如果推特長度小于
100
個(gè)字符怔檩,將其標(biāo)記為short
;如果在100
到135
個(gè)字符之間蓄诽,將其標(biāo)記為medium
薛训;如果超過135
個(gè)字符,將其標(biāo)記為long
仑氛。 - 使用
apply
來生成一個(gè)新的列tweet_length
乙埃。 - 找出關(guān)于每個(gè)候選人的推特落入到每個(gè)組中的個(gè)數(shù)。
def tweet_lengths(text):
if len(text) < 100:
return "short"
elif 100 <= len(text) <= 135:
return "medium"
else:
return "long"
tweets["tweet_length"] = tweets["text"].apply(tweet_lengths)
tl = {}
for candidate in ["clinton", "sanders", "trump"]:
tl[candidate] = tweets["tweet_length"][tweets["candidate"] == candidate].value_counts()
繪圖
現(xiàn)在锯岖,我們有了想要繪制的數(shù)據(jù)了介袜,可以生成并排柱狀圖了。我們將使用bar
方法來在相同的軸上出吹,為每個(gè)候選人繪制推特長度遇伞。然而,我們將使用一個(gè)偏移量來將所繪制的第二個(gè)和第三個(gè)候選人的條向右偏移捶牢。這將為我們提供三個(gè)分類區(qū)域赃额,short
, medium
, 和long
,每個(gè)區(qū)域中叫确,每個(gè)候選人有一個(gè)條跳芳。
下面的代碼中,我們:
- 創(chuàng)建一個(gè)Figure和一個(gè)Axes對象竹勉。
- 為每個(gè)條定義
width
飞盆,.5
。 - 生成值序列
x
,即0
,2
,4
吓歇。每個(gè)值是一個(gè)分類孽水,例如short
,medium
, 和long
,的起始城看。我們設(shè)置每個(gè)分類之間的距離為2
女气,這樣多個(gè)條之間就有空間了。 - 在Axes對象上繪制
clinton
推特测柠,條位于x
定義的位置上炼鞠。 - 在Axes對象上繪制
sanders
推特,但是添加width
到x
上轰胁,使得條移動到右方谒主。 - 在Axes對象上繪制
trump
推特,但是添加width * 2
到x
上赃阀,使得條移動到更右方霎肯。 - 設(shè)置軸標(biāo)簽和標(biāo)題。
- 使用
set_xticks
將刻度標(biāo)記移動到每個(gè)分類區(qū)域的中心榛斯。 - 設(shè)置刻度標(biāo)記观游。
fig, ax = plt.subplots()
width = .5
x = np.array(range(0, 6, 2))
ax.bar(x, tl["clinton"], width, color='g')
ax.bar(x + width, tl["sanders"], width, color='b')
ax.bar(x + (width * 2), tl["trump"], width, color='r')
ax.set_ylabel('# of tweets')
ax.set_title('Number of Tweets per candidate by length')
ax.set_xticks(x + (width * 1.5))
ax.set_xticklabels(('long', 'medium', 'short'))
ax.set_xlabel('Tweet length')
plt.show()
下一步
我們已經(jīng)學(xué)到了很多關(guān)于matplotlib生成圖的知識,以及仔細(xì)好好看了該數(shù)據(jù)集驮俗。如果你想要閱讀更多關(guān)于matplotlib內(nèi)部如何繪制的內(nèi)容懂缕,閱讀這里。
接下來意述,你可以繪制很多的圖:
- 分析用戶描述,看看描述長度怎樣因候選人而不同吮蛹。
- 瀏覽當(dāng)天時(shí)間 —— 某個(gè)候選人的支持者在某個(gè)特定時(shí)間會發(fā)更多推特嗎荤崇?
- 探索用戶位置,看看哪個(gè)州發(fā)關(guān)于哪個(gè)候選人最多的推特潮针。
- 看看什么樣子的用戶名發(fā)關(guān)于哪個(gè)候選人最多的推特术荤。
- 用戶名中更多的數(shù)字是否與某個(gè)候選人相關(guān)聯(lián)齐媒?
- 哪個(gè)候選人擁有最多的全大寫用戶名的支持者图筹?
- 抓取更多的數(shù)據(jù),看看模式是否轉(zhuǎn)變炫掐。
希望這個(gè)matplotlib教程有用焦读,如果你對這個(gè)數(shù)據(jù)做了任何好玩的分析子库,在下面(Ele注:去原文哈)留言吧 —— 我們很想知道!