Python數據可視化--matplotlib

 

 抽象化|具體化: 如盒形圖 | 現實中的圖html

功能性|裝飾性:沒有裝飾和渲染 | 包含藝術性美學上的裝飾canvas

深度表達|淺度表達:深刻層次的研究探索數據 | 易於理解的,直觀的表示api

多維度|單一維度:數據的多個層次 | 數據的單一維度app

創造性|熟悉性:全新的方式進行可視化 | 被大衆接受而且熟悉的方式dom

新穎性|冗餘性: 每一個元素只表述一次 | 每一個元素表示屢次函數

 Matplotlib:spa

  • Backend層
    • 用於處理向屏幕或文件渲染圖形
  • Artist層
    • 包含圖像繪製的容器:Figure, Subplot 及Axes。
    • 包含基本元素,如: Line2D,Rectange等。
  • Scripting層
    • 簡化訪問Artist和Backend層的過程

pyplot3d

https://matplotlib.org/users/pyplot_tutorial.htmlcode

  • pyplot可經過gcf(get current figure)獲取當前圖像對象,gca(get current axis)獲取當前座標軸對象
  • pyplot只是對axes對象的調用作了「鏡像」,能夠經過pyplot.plot()進行繪圖,其底層調用的仍是axes.plot() 函數

散點圖htm

  • plt.scatter()
  • plt.xlabel()
  • plt.ylabel()
  • plt.title()
  • plt.legend()
  • 線性,標記,顏色ax.plot(x,y,'r--') == ax.plot(x,y,linestyle='--',color='r')

 線圖:

  • plt.plot()
  • plt.gca().fill_between() 填充線間的區域
  • np.array()生成時間數據
  • 若是座標軸是以時間的,能夠藉助pandas 的to_datetime()
  • plt.xticks(rotation=) 或者遍歷ticks進行set_rotation()
  • plt.subplots_adjust().調整邊界距離

柱狀圖

  • plt.bar()
  • group bar chart 當同一個圖包含多個柱狀圖是,要對x軸相對作平移,避免柱狀圖的重疊
  • stack bar chart 用bottom參數
  • 橫向柱狀圖:barh, width = height; bottom = left

適用場景

 

 1. Matplotlib 

import matplotlib as mpl
mpl.get_backend()

2. 簡單繪圖,

import matplotlib.pyplot as plt
plt.plot(3, 2)
plt.show()

 

  上圖看不到任何的點。

plt.plot(3, 2, '*')

     使用scipting 層

from matplotlib.backends.backend_agg import FigureCanvasAgg
from matplotlib.figure import Figure

fig = Figure()
canvas = FigureCanvasAgg(fig)

ax = fig.add_subplot(111)
ax.plot(3, 2, '.')
canvas.print_png('test.png')

  gca 獲取當前座標軸對象

plt.figure()
plt.plot(3, 2, 'o')
ax = plt.gca()
# 設置座標軸範圍
ax.axis([0, 6, 0, 10])
# matplot 會自動用顏色區分不一樣的數據
plt.figure()
plt.plot(1.5, 1.5, 'o')
plt.plot(2, 2, '*')
plt.plot(2.5, 2.5, '*')

3. 散點圖

import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = x

plt.figure()
plt.scatter(x, y)

import matplotlib as mpl
import matplotlib.pyplot as plt  
# 改變顏色及大小

import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = x
colors = ['red'] * (len(x) - 1)
colors.append('green')

plt.figure()
plt.scatter(x, y, s=100, c=colors)
plt.show()

# 使用zip合併兩個列表爲一個新列表
# 新列表中的每一個元素爲對應位置上的元組
l1 = list(range(1, 6))
l2 = list(range(6, 11))
zip_generator = zip(l1, l2)
tuple_list = list(zip_generator)
print(type(zip_generator))
print(list(tuple_list))

<class 'zip'>
[(1, 6), (2, 7), (3, 8), (4, 9), (5, 10)]
# 使用*進行對元組列表解包
x, y = zip(*tuple_list)
print(x)
print(y)
plt.figure()
plt.scatter(x[:2], y[:2], c='red', label='samples 1')
plt.scatter(x[2:], y[2:], c='blue', label='samples2')

4. 線圖

import numpy as np

linear_data = np.arange(1, 9)
quadratic_data = linear_data ** 2

plt.figure()
plt.plot(linear_data, '-o', quadratic_data, '-o')

# 注意,這裏咱們只指定了y軸數據,x軸的數據是matplotlib自動生成的

 

plt.plot([22, 44, 66], '--r')
# 添加座標軸標籤及圖例
plt.xlabel('x data')
plt.ylabel('y data')
plt.title('Line Chart Title')
plt.legend(['legend1', 'legend2', 'legend3'])
# 填充兩個line間的區域
plt.gca().fill_between(range(len(linear_data)),
                      linear_data, quadratic_data,
                      facecolor='green',
                      alpha=0.25)
# 繪製橫軸爲時間的線圖
plt.figure()
observation_dates = np.arange('2017-10-11', '2017-10-19', dtype='datetime64[D]')
observation_dates
plt.plot(observation_dates, linear_data, '-o',
        observation_dates, quadratic_data, '-o')
# 橫軸並非咱們想要的結果

# 藉助pandas繪製橫軸爲時間的線圖
import pandas as pd
plt.figure()
observation_dates = np.arange('2017-10-11', '2017-10-19', dtype='datetime64[D]')
observation_dates = list(map(pd.to_datetime, observation_dates))
plt.plot(observation_dates, linear_data, '-o',
        observation_dates, quadratic_data, '-o')

# plt.xticks(rotation='45')
x = plt.gca().xaxis
for item in x.get_ticklabels():
    item.set_rotation(45)
# 調整邊界距離
plt.subplots_adjust(bottom=0.25)
# 對於學術製圖,可在標題中包含latex語法
ax = plt.gca()
ax.set_title('Quadratic ($x^2$) vs. Linear ($x$)')

5. 柱狀圖

plt.figure()
x_vals = list(range(len(linear_data)))
plt.bar(x_vals, linear_data, width=0.3)

# group bar chart
# 同一副圖中添加新的柱狀圖
# 注意,爲了避免覆蓋第一個柱狀圖,須要對x軸作偏移
x_vals2 = [item + 0.3 for item in x_vals]
plt.bar(x_vals2, quadratic_data, width=0.3)

# stack bar chart
plt.figure()
x_vals = list(range(len(linear_data)))
plt.bar(x_vals, linear_data, width=0.3)
plt.bar(x_vals, quadratic_data, width=0.3, bottom=linear_data)

# 橫向柱狀圖
plt.figure()
x_vals = list(range(len(linear_data)))
plt.barh(x_vals, linear_data, height=0.3)
plt.barh(x_vals, quadratic_data, height=0.3, left=linear_data)

 4. 直方圖

  •      直方圖是對數據分佈狀況的圖形表示
  •      首先對數據進行分組,而後統計每一個分組內數據的數量
  •      顯示每一個分組頻率或者數量分佈;易於顯示各組之間頻率或者數量的差異
  •      plt.hist(data,bins): data數據集合,bins分組邊界和分組個數
import matplotlib as mpl
import matplotlib.pyplot as plt  

data = [50,20,33,51,99,31,5,6,4,5,89,12,56,43]
bins = [0,10,20,40,50,60,70,80,100]
plt.hist(data,bins)
plt.show()

盒形圖(箱狀圖)

  • 下邊緣(Q1),表示最小值;
  • 下四分位數(Q2),又稱「第一四分位數」,等於該樣本中全部數值由小到大排列後第25%的數字;
  • 中位數(Q3),又稱「第二四分位數」等於該樣本中全部數值由小到大排列後第50%的數字;
  • 上四分位數(Q4),又稱「第三四分位數」等於該樣本中全部數值由小到大排列後第75%的數字;
  • 上邊緣(Q5),表述最大值。

第三四分位數與第一四分位數的差距又稱四分位間距。

功能:

  • 箱型圖有個功能就是能夠檢測這組數據是否存在異常值。異常值在哪裏呢?就是在上邊緣和下邊緣的範圍以外。
  • 能夠直接看出多組數據分佈狀況。
#首先導入基本的繪圖包
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

#添加成績表
plt.style.use("ggplot")
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.sans-serif']=['SimHei'] 

#新建一個空的DataFrame
df=pd.DataFrame()
 #添加成績單,最後顯示成績單表格
df["英語"]=[76,90,97,71,70,93,86,83,78,85,81]
df["經濟數學"]=[65,95,51,74,78,63,91,82,75,71,55]
df["西方經濟學"]=[93,81,76,88,66,79,83,92,78,86,78]
df["計算機應用基礎"]=[85,78,81,95,70,67,82,72,80,81,77]
print(df)
#用matplotlib來畫出箱型圖
plt.boxplot(x=df.values,labels=df.columns,whis=1.5)
plt.show()

熱圖(heatmap):

  • 能夠用於三維以上的數據可視化
  • plt.imshow(arr)
  • plt.hist2d()
  • plt.colorbar()添加顏色

 

import plotly
import plotly.plotly as py
import plotly.graph_objs as go

plotly.tools.set_credentials_file(username='Jessse_Li',api_key='your key')

trace = go.Heatmap(z=[[1, 20, 30],
                      [20, 1, 60],
                      [30, 60, 1]])
data=[trace]
py.iplot(data, filename='basic-heatmap')

Heatmap 加上標籤信息

trace = go.Heatmap(z=[[1, 20, 30, 50, 1], [20, 1, 60, 80, 30], [30, 60, 1, -10, 20]],
                   x=['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'],
                   y=['Morning', 'Afternoon', 'Evening'])
data=[trace]
py.iplot(data, filename='labelled-heatmap')

heatmap 加上時間序列

import datetime
import numpy as np
import plotly.plotly as py
import plotly.graph_objs as go

programmers = ['Alex','Nicole','Sara','Etienne','Chelsea','Jody','Marianne']

base = datetime.datetime.today()
date_list = [base - datetime.timedelta(days=x) for x in range(0, 180)]

z = []

for prgmr in programmers:
    new_row = []
    for date in date_list:
        new_row.append( np.random.poisson() )
    z.append(list(new_row))

data = [
    go.Heatmap(
        z=z,
        x=date_list,
        y=programmers,
        colorscale='Viridis',
    )
]

layout = go.Layout(
    title='GitHub commits per day',
    xaxis = dict(ticks='', nticks=36),
    yaxis = dict(ticks='' )
)

fig = go.Figure(data=data, layout=layout)
py.iplot(fig, filename='datetime-heatmap')

相關文章
相關標籤/搜索