python制作图_Python做图的方法
最近一直沒有更新文章,在學習Machine learning。然后業余在kaggle那里瞎轉,對Python常用的作圖摸了個遍,本文將對這些作圖方法做個簡單介紹
一般我們作圖主要是為了看數據分布、數據趨勢、以及比較大小。常用的圖包括:
line(折線圖):展示趨勢
scatter (散點圖):展示分布(機械學習中經常使用)
bar (柱狀圖):感覺柱狀圖主要是多項目的趨勢比較
pie (餅圖):展示分布
box (箱型圖):展示單個項目數據的分布細節
heatmap (熱力圖):主要是列聯表表示數據相對大小
作圖的工具有很多,例如Pandas、Seaborn、ggplot、Bokeh、Plotly、Pypal。而對于我來說,作圖的工具主要就是兩種matplotlib和seaborn兩種。matplotlib可以在numpy數組里面使用,也可以處理pandas中的dataframe。
此外matplotlib還是python作圖的基礎包,大部分作圖模塊都是基于matplotlib來的,因此matplotlib的自定義屬性最高。為了減少美化以及配色的麻煩,我一般時候喜歡作圖的使用通過引用ggplot的style來解決美化問題:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot') ##使得作圖自帶色彩,這樣不用費腦筋去考慮配色什么的;
%matplotlib inline
numpy array的作圖
numpy數組主要是出現在python的數據分析里面,例如,在監督型學習的時候,需要做對分布的散點進行模式識別,并擬合。在擬合的過程中,需要用到梯度下降法,為了快速了解收斂的過程,需要對cost function進行監督。
在這里先不描述梯度下降法的作圖方法,先簡單介紹numpy數組的散點圖以及擬合方法(注意poly1d不是擬合方法,而是一個多項式生成器,真正的擬合在polyfit那里)。通過linspace生成一組數據,并引入random:
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()
這樣就可以生成下面的這個圖了:
一維擬合
當然,可以看到。這個圖里面散點的點比較大,可以通過改變s參數更改散點的大小(如果將s變為一個函數,那么散點圖就可以成為泡沫圖了),線可以通過linewidth 加粗。在這里,我們將s調大,并將其調成半透明,將線加粗,加入軸說明和圖表抬頭(title的字號大小通過fontsize來改變):
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的作圖方法
dataframe里面一般涉及幾組參數,一般無外乎是通過作圖來發現參數組之間的規律或者關系。并且Pandas里面所有的作圖可以都可以通過df.plot來實現,不同的圖僅僅需要plot函數中的kind參數,將其改為ine、scatter、bar和pie等可以生成對應的圖,詳細需要看Visualization章節。在這里,我將以散點圖為例做一個講解:
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)
先生成一個數據表格:
df
例如,我想看x-H的散點圖關系。可以將其中的kind參數設置為scatter,x和y的值取為對應列的名稱,加入title就可以了:
df.plot(kind='scatter', x='x', y='H')
plt.title('x vs H')
plt.show()
x vs H
當然,如果我想同時看x,y,z對H的影響,似乎就要將上面的這個圖重復三遍,比較麻煩。Pandas里面的scatter_matrix就可以解決這個問題,引用pandas.tools.plotting中的scatter_matrix函數:
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
這是一種比較特殊的圖,一般是對pivot_table的可視化展出,由于這種展示效果比較好,也比較直觀,所以想在這里稍微提一下。先給出heatmap中的例子,稍微作了下改動,展示的是6*6隨機數矩陣:
import numpy as np
import seaborn as sns
random_set = np.random.randint(0,10,(6,6))
sns.heatmap(random_set)
在一開始我提到了,這個東西比較多的可以用在pivot_table里面,舉個例子,我要展示幾個旗艦店(A店、B店、C店)的商品(a、b、c、d、e)的銷量。手頭上沒有數據,生成個隨機數組湊合著用吧:
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()
生成出來的數據大概是這個樣子的:
隨機原始數據
對其進行數據透視,以Mall為列,以Commodity為行,總計售出商品數量:
pivot_df = pd.pivot_table(df, index='com', columns='mall', values=['amount'], aggfunc=np.sum)
pivot_df
數據透視后
通過heatmap將其進行可視化轉化:
sns.heatmap(pivot_df)
plt.xlabel('Mall')
plt.ylabel('Commodity')
plt.title('Mall_Commodity')
plt.show()
數據透視的可視化
使用heatmap的幾個重要的參數,vmin和vmax可以控制整圖的最小和最大值,cmap為整體配色方案,annot參數用來控制是否顯示原始數據,fmt用來控制展示數據格式,linewidths和linecolor用來控制分割線的粗細以及顏色,cbar用來確認是否顯示圖例。下面將調整一下最大和最小值,并且打開annot,更改整體配色方案,將分割線加粗并設置為白色看看:
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()
數據透視的可視化_改
小結
想想,作圖也是我在python學習里面的一個巨坑,因為命令和參數比較多,但是用的比較少,偏偏作圖包還比較多,一直搞不太懂各種的邏輯,所以一直忘記。這一次經過給自己一個詳細的總結之后,應該會好很多。
在Python作圖里面,還有一類圖比較常見,就是地圖。之前雖然我也有利用plotly玩過,但感覺還是沒有進到里面的細節。我會再用一篇文章詳細講述一下,敬請期待。
總結
以上是生活随笔為你收集整理的python制作图_Python做图的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 致敬王选院士
- 下一篇: 哀悼!知名教授逝世,享年55岁!