<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楷掉。而對于我來說,作圖的工具主要就是兩種matplotlib和seaborn兩種霞势。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>
<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()
<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()
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>
<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
<p>通過heatmap將其進(jìn)行可視化轉(zhuǎn)化:</p>
sns.heatmap(pivot_df)
plt.xlabel('Mall')
plt.ylabel('Commodity')
plt.title('Mall_Commodity')
plt.show()
<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()
小結(jié)
<p>想想食店,作圖也是我在python學(xué)習(xí)里面的一個巨坑渣淤,因為命令和參數(shù)比較多,但是用的比較少吉嫩,偏偏作圖包還比較多价认,一直搞不太懂各種的邏輯,所以一直忘記自娩。這一次經(jīng)過給自己一個詳細(xì)的總結(jié)之后用踩,應(yīng)該會好很多。</p>
<p>在Python作圖里面忙迁,還有一類圖比較常見脐彩,就是地圖。之前雖然我也有利用plotly玩過姊扔,但感覺還是沒有進(jìn)到里面的細(xì)節(jié)惠奸。我會再用一篇文章詳細(xì)講述一下,敬請期待恰梢。</p>