1. 程式人生 > >python資料分析之資料視覺化matplotlib

python資料分析之資料視覺化matplotlib

import matplotlib.pyplot as plt
import numpy as np
import numpy.random as randn
import pandas as pd
from pandas import Series,DataFrame
from pylab import mpl
mpl.rcParams['axes.unicode_minus'] = False # 我自己配置的問題
plt.rc('figure', figsize=(10, 6)) # 設定影象大小
%matplotlib inline

1. figure物件

Matplotlib的影象均位於figure物件中。

  • 建立figure: plt.figure()
fig = plt.figure()

2. subplot子圖

  • add_subplot:向figure物件中新增子圖。
    add_subplot(a, b, c):a,b 表示講fig分割成axb的區域,c 表示當前選中要操作的區域(c從1開始)。
    add_subplot返回的是AxesSubplot物件,plot 繪圖的區域是最後一次指定subplot的位置
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2
,2,2) ax3 = fig.add_subplot(2,2,3) ax4 = fig.add_subplot(2,2,4)
random_arr = randn.rand(50)
# 預設是在最後一次使用subplot的位置上作圖
plt.plot(random_arr,'ro--') # r:表示顏色為紅色,o:表示資料用o標記 ,--:表示虛線
# 等價於:
# plt.plot(random_arr,linestyle='--',color='r',marker='o')
plt.show()

這裡寫圖片描述

# hist:直方圖:統計分佈情況
plt.hist(np.random.rand(8
), bins=6, color='b', alpha=0.3) # bins:資料箱子個數
(array([ 3.,  0.,  0.,  0.,  2.,  3.]),
 array([ 0.10261627,  0.19557319,  0.28853011,  0.38148703,  0.47444396,
         0.56740088,  0.6603578 ]),
 <a list of 6 Patch objects>)

這裡寫圖片描述

# 散點圖
plt.scatter(np.arange(30), np.arange(30) + 3 * randn.randn(30))

這裡寫圖片描述

  • subplots :生成子圖/子圖陣列
# 柱狀圖
fig, ax = plt.subplots()
x = np.arange(5)
y1, y2 = np.random.randint(1, 25, size=(2, 5))
width = 0.25
ax.bar(x, y1, width, color='r') # 畫柱子
ax.bar(x+width, y2, width, color='g') # 畫柱子
ax.set_xticks(x+width)
ax.set_xticklabels(['a', 'b', 'c', 'd', 'e']) # 下標註明

這裡寫圖片描述

fig, axes = plt.subplots(2, 2, sharex=True, sharey=True) # 共享軸座標

這裡寫圖片描述

  • subplots_adjust:調整subplots的間距
plt.subplots_adjust(left=0.5,top=0.5)
fig, axes = plt.subplots(2, 2)

這裡寫圖片描述

random_arr = randn.randn(8)
fig, axes = plt.subplots(2, 2)
axes[0, 0].hist(random_arr, bins=16, color='k', alpha=0.5)
axes[0, 1].plot(random_arr,'ko--')
x = np.arange(8)
y = x + 5 * np.random.rand(8)
axes[1,0].scatter(x, y)
x = np.arange(5)
y1, y2 = np.random.randint(1, 25, size=(2, 5))
width = 0.25
axes[1,1].bar(x, y1, width, color='r') # 畫柱子
axes[1,1].bar(x+width, y2, width, color='g') # 畫柱子
axes[1,1].set_xticks(x+width)
axes[1,1].set_xticklabels(['a', 'b', 'c', 'd', 'e']) # 下標註明

這裡寫圖片描述

  • 重疊繪製
  • legend:顯示圖例
random_arr1 = randn.randn(8)
random_arr2 = randn.randn(8)
fig, ax = plt.subplots()
ax.plot(random_arr1,'ko--',label='A')
ax.plot(random_arr2,'b^--',label='B')
plt.legend(loc='best') # 自動選擇放置圖例的最佳位置

這裡寫圖片描述

  • 設定刻度範圍:set_xlim、set_ylim
  • 設定顯示的刻度:set_xticks、set_yticks
  • 刻度標籤:set_xticklabels、set_yticklabels
  • 座標軸標籤:set_xlabel、set_ylabel
  • 影象標題:set_title
fig, ax = plt.subplots(1)
ax.plot(np.random.randn(380).cumsum())

# 設定刻度範圍
ax.set_xlim([0, 500])

# 設定顯示的刻度(記號)
ax.set_xticks(range(0,500,100))

# 設定刻度標籤
ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'],
                            rotation=30, fontsize='small')

# 設定座標軸標籤
ax.set_xlabel('X:...')
ax.set_ylabel('Y:...')

# 設定標題
ax.set_title('Example')

這裡寫圖片描述

3. Plotting functions in pandas

plt.close('all')
s = Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10))
s
fig,ax = plt.subplots(1)
s.plot(ax=ax,style='ko--')

這裡寫圖片描述

fig, axes = plt.subplots(2, 1)
data = Series(np.random.rand(16), index=list('abcdefghijklmnop'))
data.plot(kind='bar', ax=axes[0], color='k', alpha=0.7)
data.plot(kind='barh', ax=axes[1], color='k', alpha=0.7)

這裡寫圖片描述

df = DataFrame(np.random.randn(10, 4).cumsum(0),
               columns=['A', 'B', 'C', 'D'],
               index=np.arange(0, 100, 10))
df
A B C D
0 -0.523822 1.061179 -0.882215 -0.267718
10 -0.178175 -0.367573 -1.465189 -1.095390
20 0.276166 0.816511 -0.344557 1.297281
30 0.529400 0.159374 -2.765168 1.784692
40 -1.129003 -1.665272 -2.746512 3.140976
50 0.265113 -1.821224 -5.140850 2.377449
60 -2.699879 -3.895255 -5.011561 1.715174
70 -2.384257 -3.480928 -4.519131 2.805369
80 -2.525243 -3.031608 -4.840125 1.106624
90 -2.020589 -3.519473 -4.823292 0.522323
df.plot() # 列索引為圖例,行索引為橫座標,值為縱座標

這裡寫圖片描述

df = DataFrame(np.random.randint(0,2,(10, 2)),
               columns=['A', 'B'],
               index=np.arange(0, 10, 1))
df
A B
0 0 1
1 0 1
2 1 0
3 0 1
4 1 0
5 1 0
6 1 1
7 0 0
8 1 0
9 1 0
df.plot(kind='bar')

這裡寫圖片描述

df.A.value_counts().plot(kind='bar')

這裡寫圖片描述

df.A[df.B == 1].plot(kind='kde')   
df.A[df.B == 0].plot(kind='kde')    # 密度圖

這裡寫圖片描述

df = DataFrame(np.random.rand(6, 4),
               index=['one', 'two', 'three', 'four', 'five', 'six'],
               columns=pd.Index(['A', 'B', 'C', 'D'], name='Genus'))
df
Genus A B C D
one 0.760750 0.951159 0.643181 0.792940
two 0.137294 0.005417 0.685668 0.858801
three 0.257455 0.721973 0.968951 0.043061
four 0.298100 0.121293 0.400658 0.236369
five 0.463919 0.537055 0.675918 0.487098
six 0.798676 0.239188 0.915583 0.456184
df.plot(kind='bar',stacked='True') #行索引:橫座標

這裡寫圖片描述

values = Series(np.random.normal(0, 1, size=200))
values.hist(bins=100, alpha=0.3, color='k', normed=True)
values.plot(kind='kde', style='k--')

這裡寫圖片描述

df = DataFrame(np.random.randn(10,2),
               columns=['A', 'B'],
               index=np.arange(0, 10, 1))
df
plt.scatter(df.A, df.B)

這裡寫圖片描述