Python做圖的方法

<p>最近一直沒有更新文章,在學(xué)習(xí)Machine learning。然后業(yè)余在kaggle那里瞎轉(zhuǎn)蓄喇,對Python常用的作圖摸了個遍,本文將對這些作圖方法做個簡單介紹</p>

<p>一般我們作圖主要是為了看數(shù)據(jù)分布旁理、數(shù)據(jù)趨勢、以及比較大小我磁。常用的圖包括:</p>

  • line(折線圖):展示趨勢
  • scatter (散點圖):展示分布(機械學(xué)習(xí)中經(jīng)常使用)
  • bar (柱狀圖):感覺柱狀圖主要是多項目的趨勢比較
  • pie (餅圖):展示分布
  • box (箱型圖):展示單個項目數(shù)據(jù)的分布細(xì)節(jié)
  • heatmap (熱力圖):主要是列聯(lián)表表示數(shù)據(jù)相對大小

<p>作圖的工具有很多孽文,例如Pandas、Seaborn夺艰、ggplot叛溢、Bokeh、Plotly劲适、Pypal楷掉。而對于我來說,作圖的工具主要就是兩種matplotlibseaborn兩種霞势。matplotlib可以在numpy數(shù)組里面使用烹植,也可以處理pandas中的dataframe。</p>

<p>此外matplotlib還是python作圖的基礎(chǔ)包愕贡,大部分作圖模塊都是基于matplotlib來的草雕,因此matplotlib的自定義屬性最高。為了減少美化以及配色的麻煩固以,我一般時候喜歡作圖的使用通過引用ggplot的style來解決美化問題:</p>

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    plt.style.use('ggplot')   ##使得作圖自帶色彩墩虹,這樣不用費腦筋去考慮配色什么的嘱巾;
    %matplotlib inline

numpy array的作圖

<p>numpy數(shù)組主要是出現(xiàn)在python的數(shù)據(jù)分析里面,例如诫钓,在監(jiān)督型學(xué)習(xí)的時候旬昭,需要做對分布的散點進(jìn)行模式識別,并擬合菌湃。在擬合的過程中问拘,需要用到梯度下降法,為了快速了解收斂的過程惧所,需要對cost function進(jìn)行監(jiān)督骤坐。</p>

<p>在這里先不描述梯度下降法的作圖方法,先簡單介紹numpy數(shù)組的散點圖以及擬合方法(注意poly1d不是擬合方法下愈,而是一個多項式生成器纽绍,真正的擬合在polyfit那里)。通過linspace生成一組數(shù)據(jù)势似,并引入random:</p>

    x = np.linspace(1,10,80)
    y = x + np.random.standard_normal(size=80)
    y_s = np.ploy1d(np.plotfit(x,y,1))(x)
    plt.scatter(x,y)
    plt.plot(x, y_s)
    plt.show()

<p>這樣就可以生成下面的這個圖了:</p>

一維擬合

<p>當(dāng)然顶岸,可以看到。這個圖里面散點的點比較大叫编,可以通過改變s參數(shù)更改散點的大小(如果將s變?yōu)橐粋€函數(shù)霹抛,那么散點圖就可以成為泡沫圖了)搓逾,線可以通過linewidth 加粗。在這里杯拐,我們將s調(diào)大霞篡,并將其調(diào)成半透明,將線加粗端逼,加入軸說明和圖表抬頭(title的字號大小通過fontsize來改變):</p>

    x = np.linspace(1,10,80)
    y = x + np.random.standard_normal(size=80)
    plt.scatter(x,y, s = 20, alpha=0.2)
    plt.plot(x, y_s, linewidth = 2)
    plt.xlabel('area')
    plt.ylabel('price')
    plt.legend(('fit', 'origin'), loc = 'best', fontsize = 8)
    plt.title('the price of the house with various area', {'fontsize':10})
    plt.show()
更改后的一維擬合

Pandas的作圖方法

<p>dataframe里面一般涉及幾組參數(shù)朗兵,一般無外乎是通過作圖來發(fā)現(xiàn)參數(shù)組之間的規(guī)律或者關(guān)系。并且Pandas里面所有的作圖可以都可以通過df.plot來實現(xiàn)顶滩,不同的圖僅僅需要plot函數(shù)中的kind參數(shù)余掖,將其改為ine、scatter礁鲁、bar和pie等可以生成對應(yīng)的圖盐欺,詳細(xì)需要看Visualization章節(jié)。在這里仅醇,我將以散點圖為例做一個講解:</p>

    x = np.linspace(0,10,101) + np.random.normal(1,0.5,101)
    y = np.linspace(20,30,101) + np.random.normal(1,0.5,101)
    z = np.linspace(40,50,101) + np.random.normal(1,0.5,101)
    df = pd.DataFrame({'x':x, 'y':y, 'z':z, 'H' : 2*x ** 3 + 3*np.log10(y)+4*z})
    df.head(5)

<p>先生成一個數(shù)據(jù)表格:</p>

df

<p>例如冗美,我想看x-H的散點圖關(guān)系∥龆可以將其中的kind參數(shù)設(shè)置為scatter粉洼,x和y的值取為對應(yīng)列的名稱节预,加入title就可以了:</p>

    df.plot(kind='scatter', x='x', y='H')
    plt.title('x vs H')
    plt.show()
x vs H

<p>當(dāng)然,如果我想同時看x属韧,y安拟,z對H的影響,似乎就要將上面的這個圖重復(fù)三遍挫剑,比較麻煩去扣。Pandas里面的scatter_matrix就可以解決這個問題,引用pandas.tools.plotting中的scatter_matrix函數(shù):</p>

  from pandas.tools.plotting import scatter_matrix
  scatter_matrix(df, figsize=(10,1  0), diagonal='kde')
  plt.suptitle('the inflence of x,y,z to H')
  plt.show()
xyz vs H

Heatmap

<p>這是一種比較特殊的圖樊破,一般是對pivot_table的可視化展出愉棱,由于這種展示效果比較好,也比較直觀哲戚,所以想在這里稍微提一下奔滑。先給出heatmap中的例子,稍微作了下改動顺少,展示的是6*6隨機數(shù)矩陣:</p>

    import numpy as np
    import seaborn as sns
    random_set = np.random.randint(0,10,(6,6))
    sns.heatmap(random_set)

<p>在一開始我提到了朋其,這個東西比較多的可以用在pivot_table里面,舉個例子脆炎,我要展示幾個旗艦店(A店梅猿、B店、C店)的商品(a秒裕、b袱蚓、c、d几蜻、e)的銷量喇潘。手頭上沒有數(shù)據(jù),生成個隨機數(shù)組湊合著用吧:</p>

    mall_all = ['mall_A', 'mall_B', 'mall_C']
    com_all = ['commodity_a', 'commodity_b','commodity_c', 'commodity_d', 'commodity_e']
    mall = np.random.choice(mall_all,(1,100))[0]
    com = np.random.choice(com_all, (1,100))[0]
    ammout = np.random.randint(1,10,(100))
    index = np.linspace(1,100, 100)
    df = pd.DataFrame({'mall':mall, 'com':com, 'amount':ammout}, index=index, columns=['mall', 'com', 'amount'])
    df.head()

<p>生成出來的數(shù)據(jù)大概是這個樣子的:</p>

隨機原始數(shù)據(jù)

<p>對其進(jìn)行數(shù)據(jù)透視梭稚,以Mall為列颖低,以Commodity為行,總計售出商品數(shù)量:</p>

    pivot_df = pd.pivot_table(df, index='com', columns='mall', values=['amount'], aggfunc=np.sum)
    pivot_df
數(shù)據(jù)透視后

<p>通過heatmap將其進(jìn)行可視化轉(zhuǎn)化:</p>

    sns.heatmap(pivot_df)
    plt.xlabel('Mall')
    plt.ylabel('Commodity')
    plt.title('Mall_Commodity')
    plt.show()
數(shù)據(jù)透視的可視化

<p>使用heatmap的幾個重要的參數(shù)弧烤,vmin和vmax可以控制整圖的最小和最大值忱屑,cmap為整體配色方案,annot參數(shù)用來控制是否顯示原始數(shù)據(jù)暇昂,fmt用來控制展示數(shù)據(jù)格式想幻,linewidths和linecolor用來控制分割線的粗細(xì)以及顏色,cbar用來確認(rèn)是否顯示圖例话浇。下面將調(diào)整一下最大和最小值脏毯,并且打開annot,更改整體配色方案幔崖,將分割線加粗并設(shè)置為白色看看:</p>

    sns.heatmap(pivot_df, vmax=80, annot=True, linecolor='white', linewidths=0.5, cmap='RdBu_r')
    plt.xlabel('Mall')
    plt.ylabel('Commodity')
    plt.title('Mall_Commodity')
    plt.show()
數(shù)據(jù)透視的可視化_改

小結(jié)

<p>想想食店,作圖也是我在python學(xué)習(xí)里面的一個巨坑渣淤,因為命令和參數(shù)比較多,但是用的比較少吉嫩,偏偏作圖包還比較多价认,一直搞不太懂各種的邏輯,所以一直忘記自娩。這一次經(jīng)過給自己一個詳細(xì)的總結(jié)之后用踩,應(yīng)該會好很多。</p>

<p>在Python作圖里面忙迁,還有一類圖比較常見脐彩,就是地圖。之前雖然我也有利用plotly玩過姊扔,但感覺還是沒有進(jìn)到里面的細(xì)節(jié)惠奸。我會再用一篇文章詳細(xì)講述一下,敬請期待恰梢。</p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末佛南,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嵌言,更是在濱河造成了極大的恐慌嗅回,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摧茴,死亡現(xiàn)場離奇詭異绵载,居然都是意外死亡,警方通過查閱死者的電腦和手機蓬蝶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猜惋,“玉大人丸氛,你說我怎么就攤上這事≈ぃ” “怎么了缓窜?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谍咆。 經(jīng)常有香客問我禾锤,道長,這世上最難降的妖魔是什么摹察? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任恩掷,我火速辦了婚禮,結(jié)果婚禮上供嚎,老公的妹妹穿的比我還像新娘黄娘。我一直安慰自己峭状,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布逼争。 她就那樣靜靜地躺著优床,像睡著了一般。 火紅的嫁衣襯著肌膚如雪誓焦。 梳的紋絲不亂的頭發(fā)上胆敞,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音杂伟,去河邊找鬼移层。 笑死,一個胖子當(dāng)著我的面吹牛稿壁,可吹牛的內(nèi)容都是我干的幽钢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼傅是,長吁一口氣:“原來是場噩夢啊……” “哼匪燕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起喧笔,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤帽驯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后书闸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尼变,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年浆劲,在試婚紗的時候發(fā)現(xiàn)自己被綠了嫌术。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡牌借,死狀恐怖度气,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情膨报,我是刑警寧澤磷籍,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站现柠,受9級特大地震影響院领,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜够吩,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一比然、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧周循,春花似錦谈秫、人聲如沸扒寄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽该编。三九已至,卻和暖如春硕淑,著一層夾襖步出監(jiān)牢的瞬間课竣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工置媳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留于樟,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓拇囊,卻偏偏與公主長得像迂曲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子寥袭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

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