使用python機(jī)器學(xué)習(xí)(四)

前面三篇文章《使用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 – 推特的情感爽醋,從-111表示非常積極爹殊,-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中刀荒,繪制一張圖包括:

  • 創(chuàng)建一個(gè)Figure來繪制圖。
  • 創(chuàng)建一個(gè)或多個(gè)Axes對象來繪制該圖棘钞。
  • 作為一個(gè)圖像缠借,顯示該圖表,以及其中的任何圖宜猜。

由于其靈活性泼返,你可以在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è)柱狀圖蝇闭。我們將傳遞取值從0candidate列的唯一值數(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操縱。

在下面的代碼中砰琢,我們會:

  • createduser_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圖中。完成這件事的通用方法是:

由于我們之前討論到的所有方法澳骤,像barhist歧强,都會在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 – 確定xy坐標(biāo)中箭頭應(yīng)該從哪里開始累澡。
  • xytext – 確定xy坐標(biāo)中文本應(yīng)該從哪里開始。
  • arrowprops – 指定箭頭相關(guān)的選項(xiàng)般贼,例如顏色永乌。

正如你所見的,關(guān)于Trump的推特明顯比其他候選人更多具伍,但是在賬號注冊年齡上,看不出顯著的差異圈驼。

多個(gè)子圖

目前為止人芽,我們使用了一些方法,像plt.barplt.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ù)主守,nrowsncols禀倔,它們定義在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è)人資料中使用紅色检吆。

首先,我們要生成兩列程储,redblue蹭沛,用來表示在每個(gè)推特用戶的個(gè)人資料背景中臂寝,每種顏色的多少,從01摊灭。

在下面的代碼中咆贬,我們將:

  • 使用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è)7x7英寸的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)題谈为。
  • 在第二個(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;如果在100135個(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推特,但是添加widthx上轰胁,使得條移動到右方谒主。
  • 在Axes對象上繪制trump推特,但是添加width * 2x上赃阀,使得條移動到更右方霎肯。
  • 設(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注:去原文哈)留言吧 —— 我們很想知道!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末矗晃,一起剝皮案震驚了整個(gè)濱河市仑嗅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖仓技,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸵贬,死亡現(xiàn)場離奇詭異,居然都是意外死亡脖捻,警方通過查閱死者的電腦和手機(jī)阔逼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來地沮,“玉大人嗜浮,你說我怎么就攤上這事∷弑簦” “怎么了周伦?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長未荒。 經(jīng)常有香客問我专挪,道長,這世上最難降的妖魔是什么片排? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任寨腔,我火速辦了婚禮,結(jié)果婚禮上率寡,老公的妹妹穿的比我還像新娘迫卢。我一直安慰自己,他們只是感情好冶共,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布乾蛤。 她就那樣靜靜地躺著,像睡著了一般捅僵。 火紅的嫁衣襯著肌膚如雪家卖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天庙楚,我揣著相機(jī)與錄音上荡,去河邊找鬼。 笑死馒闷,一個(gè)胖子當(dāng)著我的面吹牛酪捡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纳账,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼逛薇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疏虫?” 一聲冷哼從身側(cè)響起金刁,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤帅涂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后尤蛮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體媳友,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年产捞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了醇锚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坯临,死狀恐怖焊唬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情看靠,我是刑警寧澤赶促,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站挟炬,受9級特大地震影響鸥滨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谤祖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一婿滓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粥喜,春花似錦凸主、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锋华,卻和暖如春嗡官,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背供置。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工谨湘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绽快,地道東北人芥丧。 一個(gè)月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像坊罢,于是被迫代替她去往敵國和親续担。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容