python -- 數據可視化(二)


python -- 數據可視化

 一、Matplotlib 繪圖


 1、圖形對象(圖形窗口)

mp.figure(窗口名稱, figsize=窗口大小, dpi=分辨率,
                   facecolor=顏色)
如果"窗口名稱"是第一次出現,那么就創建一個新窗口,其標題欄顯示該名稱,如果"窗口名稱"已經出現過,那么不再創建新窗口,而只是將與該名稱相對應的窗口設置為當前窗口。所謂當前窗口,就是接受后續繪圖操作的窗口。
mp.title(標題文本, fontsize=字體大小)
mp.xlabel(水平軸標簽, fontsize=字體大小)
mp.ylabel(垂直軸標簽, fontsize=字體大小)
mp.tick_params(..., labelsize=刻度標簽字體大小, ...)
mp.grid(linestyle=網格線型)
mp.tight_layout() # 緊湊布局

demo:

from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as mp
x = np.linspace(-np.pi, np.pi, 1000)            # -π — π,平分為1000等份
cos_y = np.cos(x) / 2
sin_y = np.sin(x)
mp.figure('Figure Object 1', figsize=(4, 3), dpi=120,
          facecolor='lightgray')                # figsize:窗口比例 ;dpi:像素 ;   facecolor:顏色
mp.title('Figure Object 1', fontsize=16)
mp.xlabel('x', fontsize=12)
mp.ylabel('y', fontsize=12)
mp.tick_params(labelsize=8)
mp.grid(linestyle=':')
mp.tight_layout()
mp.figure('Figure Object 2', figsize=(4, 3), dpi=120,
          facecolor='lightgray')
mp.title('Figure Object 2', fontsize=16)
mp.xlabel('x', fontsize=12)
mp.ylabel('y', fontsize=12)
mp.tick_params(labelsize=8)
mp.grid(linestyle=':')
mp.tight_layout()
mp.figure('Figure Object 1')        # 覆蓋第一個窗口
mp.plot(x, cos_y, c='dodgerblue',
        label=r'$y=\frac{1}{2}cos(x)$')
mp.legend()
mp.figure('Figure Object 2')
mp.plot(x, sin_y, c='orangered',
        label=r'$y=sin(x)$')        # label為備注
mp.legend()
mp.show()

界面:

     


 

2、條形圖

mp.bar(水平坐標, 高度, 寬度[, 底坐標], color=顏色,
    alpha=透明度, label=圖例標簽)

demo:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as mp
apples = np.array([
    30, 25, 22, 36, 21, 29, 20, 24, 33, 19, 27, 15])
oranges = np.array([
    24, 33, 19, 27, 35, 20, 15, 27, 20, 32, 20, 22])
mp.figure('Bar', facecolor='lightgray')   # 繪圖窗口
mp.title('Bar', fontsize=20)
mp.xlabel('Month', fontsize=14)
mp.ylabel('Price', fontsize=14)
mp.tick_params(labelsize=10)        # x、y label的字體大小
mp.grid(axis='y', linestyle=':')    # 網格線,y方向,點線類型
mp.ylim((0, 40))                    # y軸范圍:0-40
x = np.arange(len(apples))
mp.bar(x, apples, 0.4, color='dodgerblue',
       label='Apple')                # 0.4:寬度 ;
mp.bar(x + 0.3, oranges, 0.4, color='orangered',
       label='Orange', alpha=0.75)    # x+0.3:水平坐標,在x基礎上便宜0.3
mp.xticks(x + 0.1, [
    'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
    'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'])   # x+0.1:x軸偏移0.1 ;  mp.xticks(位置序列[, 標簽序列])
mp.legend()
mp.show()

界面:

 


 

3、餅圖

mp.pie(值, 間隙, 標簽, 顏色, 格式,
    shadow=是否帶陰影, startangel=起始角度)

demo:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as mp
values = [26, 17, 21, 29, 11]
spaces = [0.05, 0.01, 0.01, 0.01, 0.01]   # 偏移值,每個餅分圖之間的距離
labels = ['Python', 'JavaScript',
          'C++', 'Java', 'PHP']
colors = ['dodgerblue', 'orangered',
          'limegreen', 'violet', 'gold']
mp.figure('Pie', facecolor='lightgray')
mp.title('Pie', fontsize=20)
mp.pie(values, spaces, labels, colors, '%d%%',
       shadow=True, startangle=90)        # shadow:陰影 ;  startangle:角度
# 等軸比例
mp.axis('equal')
mp.show()

界面:

 


4、等高線圖

mp.contourf(x, y, z, 階數, cmap=顏色映射)
mp.contour(x, y, z, 階數, linewidths=線寬)

demo:

from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as mp
n = 1000
# 網格化
x, y = np.meshgrid(np.linspace(-3, 3, n),
                   np.linspace(-3, 3, n))
z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(
    -x ** 2 - y ** 2)
mp.figure('Contour', facecolor='lightgray')
mp.title('Contour', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
# 繪制等高線圖
mp.contourf(x, y, z, 8, cmap='jet')
cntr = mp.contour(x, y, z, 8, colors='black',
                  linewidths=0.5)
# 為等高線圖添加高度標簽
mp.clabel(cntr, inline_spacing=1, fmt='%.1f',
          fontsize=10)
mp.show()

界面:

 


 5、熱成像圖

# origin ↓↓↓: 
#    hight: 缺省,原點在左上角
#    low:原點在左下角
mp.imshow(矩陣, cmap=顏色映射, origin=縱軸方向)


#demo:
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as mp
n = 1000
# 網格化
x, y = np.meshgrid(np.linspace(-3, 3, n),
                   np.linspace(-3, 3, n))
z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(
    -x ** 2 - y ** 2)
mp.figure('Hot', facecolor='lightgray')
mp.title('Hot', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
# 繪制熱成像圖
mp.imshow(z, cmap='jet', origin='low')
mp.colorbar().set_label('z', fontsize=14)
mp.show()

界面:

 


 

6、極坐標系

mp.gca(projection='polar')
水平坐標 -> 極角
垂直坐標 -> 極徑
mp.plot(水平坐標, 垂直坐標, ...)
mp.plot(極角, 極徑, ...)

demo:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as mp
t = np.linspace(0, 2 * np.pi, 1001)  # 1001個點,1000等分
r_spiral = 0.8 * t  # 阿基米德螺旋線
r_rose = 5 * np.sin(6 * t)  # 六元玫瑰線
mp.figure('Polar', facecolor='lightgray')
mp.gca(projection='polar')  # 設置極坐標系
mp.title('Polar', fontsize=20)
mp.xlabel(r'$\theta$', fontsize=14)
mp.ylabel(r'$\rho$', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
# 函數值   = f (自變量)
# 垂直坐標 = f (水平坐標)
# 極徑     = f (極角)
mp.plot(t, r_spiral, c='dodgerblue',
        label=r'$\rho=0.8\theta$')
mp.plot(t, r_rose, c='orangered',
        label=r'$\rho=5sin(6\theta)$')
mp.legend()
mp.show()

界面:

 


 

7、三維曲面

from mpl_toolkits.mplot3d import axes3d    #3d
ax = mp.gca(projection='3d') # class axes3d 指定
ax.set_xlabel(...)
...
ax.plot_surface(x, y, z, rstride=行跨距, cstride=列跨距,
    cmap=顏色映射)   # 用於繪制表面圖
ax.plot_wireframe(x, y, z, rstride=行跨距, cstride=列跨距,
    linewidth=線寬, color=顏色)     # 用於繪制三維線框圖

demo: 

 1)三維表面圖

import numpy as np
import matplotlib.pyplot as mp
from mpl_toolkits.mplot3d import axes3d
n = 1000
# 網格化
x, y = np.meshgrid(np.linspace(-3, 3, n),
                   np.linspace(-3, 3, n))
z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(
    -x ** 2 - y ** 2)
mp.figure('3D Surface')
# 創建三維坐標系
ax = mp.gca(projection='3d')  # 返回axes3d類的對象
mp.title('3D Surface', fontsize=20)
ax.set_xlabel('x', fontsize=14)
ax.set_ylabel('y', fontsize=14)
ax.set_zlabel('z', fontsize=14)
mp.tick_params(labelsize=10)
# 繪制三維表面圖
ax.plot_surface(x, y, z, rstride=10, cstride=10,
                cmap='jet')
mp.show()

界面:

 

2)三維線框圖

from __future__ import unicode_literals
import numpy as np
import matplotlib.pyplot as mp
from mpl_toolkits.mplot3d import axes3d
n = 1000
# 網格化
x, y = np.meshgrid(np.linspace(-3, 3, n),
                   np.linspace(-3, 3, n))
z = (1 - x / 2 + x ** 5 + y ** 3) * np.exp(
    -x ** 2 - y ** 2)

mp.figure('3D Wireframe')
# 創建三維坐標系
ax = mp.gca(projection='3d')  # 返回axes3d類的對象
mp.title('3D Wireframe', fontsize=20)
ax.set_xlabel('x', fontsize=14)
ax.set_ylabel('y', fontsize=14)
ax.set_zlabel('z', fontsize=14)
mp.tick_params(labelsize=10)
# 繪制三維線框圖
ax.plot_wireframe(x, y, z, rstride=30, cstride=30,
                  linewidth=0.5, color='dodgerblue')
mp.show()

界面:

 


 二、numpy進階

1、讀取文件

# 邏輯上可被解釋為二維數組的文本文件:
# 數據項1<分隔符>數據項2<分隔符>...<分隔符>數據項n ...
numpy.loadtxt(
    文件路徑,
    delimiter=分隔符(默認空格),
    usecols=列序列(默認讀取所有列),
    unpack=是否展開列(默認為False),
    dtype=元素類型(默認為float),
    converters=轉換器字典(默認不做轉換))
# unpack=False: 一個二維數組
# unpack=True: 多個一維數組

demo1:

import numpy as np
# 讀取aapl.csv中的某些列數據
dates, opening_prices, highest_prices, lowest_prices, closing_prices = np.loadtxt(
        '../../data/aapl.csv',   # 文件路徑
        delimiter=',', 
        usecols=(1, 3, 4, 5, 6),   # 讀取1,3,4,5,6 列的數據,從0計數
        unpack=True,    # 展開成多個一維數組
        dtype='M8[D], f8, f8, f8, f8',    # 每列讀取出來的元素類型不一樣
        ) 

 demo2:畫制 K線

 K線介紹:

 

# -*- coding: utf-8 -*-
import datetime as dt
import numpy as np
import matplotlib.pyplot as mp
import matplotlib.dates as md

def dmyToymd(dmy):
    # 將"日-月-年"格式轉為"年-月-日"格式
    dmy = str(dmy, encoding='utf-8')   # dmy:字節問題,通過str utf8編碼,將其轉換為字符串格式
    date = dt.datetime.strptime(dmy, "%d-%m-%Y").date()   # 將字符串格式的對象的dmy,轉換成日期對象,且指定為date類型,不包括具體時間
    ymd = date.strftime("%Y-%m-%d")    # 將日期對象重新轉換成字符串格式並返回
    return ymd


# 讀取文件數據
# dates:日期 , opening_prices:開盤價, highest_prices:最高價 , lowest_prices:最低價 , closing_prices:收盤價
dates, opening_prices, highest_prices, lowest_prices, closing_prices = np.loadtxt(
    "../data/aapl.csv",
    delimiter = ",",
    usecols = (1,3,4,5,6),       # 讀取1 ,3 ,4 ,5 ,6列的數據
    unpack = True,
    dtype = "M8[D], f8, f8, f8, f8",    # 1列日期格式 Y-M-D,
    converters = {1:dmyToymd}        # 將讀取到的第一列數據傳入:dmyToymd函數中,執行過dmyToymd后再將值傳回來,賦值給dates
)

# 畫圖
mp.figure("Candlestick", facecolor="lightgray")
mp.title("Candlestick", fontsize=20)
mp.xlabel("Date", fontsize=14)
mp.ylabel("Price", fontsize=14)
ax = mp.gca()            # 拿到當前坐標軸
ax.xaxis.set_major_locator(md.WeekdayLocator(byweekday=md.MO))        # 設置水平坐標以星期(WeekdayLocator)為周期,並且設置每個星期的星期一(byweekday=md.MO)為主刻度
ax.xaxis.set_minor_locator(md.DayLocator())        # 設置水平坐標每一天為次刻度
ax.xaxis.set_major_formatter(md.DateFormatter("%Y-%m-%d"))  # 設置水平坐標主刻度標簽格式。 md.DateFormatter("%d %b %Y"):國際通用格式

mp.tick_params(labelsize=10)            # 設置刻度線label大小
mp.grid(linestyle=":")            # 設置網格及其格式

dates = dates.astype(md.datetime.datetime)        # 將dates轉換成matplotlib能識別的日期格式 ,不然會報錯
# 陽線掩碼,收盤價高於開盤價
rise = closing_prices - opening_prices >= 0.01
# 陰線掩碼,收盤價低於開盤價
fall = opening_prices - closing_prices >= 0.01
# 填充色
fc = np.zeros(dates.size, dtype='3f4')
fc[rise], fc[fall] = (1, 1, 1), (0, 0.5, 0)        # 填充色→ 陽線:白色 ,陰線:綠色
# 邊緣色
ec = np.zeros(dates.size, dtype='3f4')
ec[rise], ec[fall] = (1, 0, 0), (0, 0.5, 0)        # 邊緣顏色→ 陽線:紅色 ,陰線:綠色
# 柱狀圖,先畫上下影線,再畫中間方塊
mp.bar(dates, highest_prices - lowest_prices, 0,
       lowest_prices, color=fc, edgecolor=ec)
mp.bar(dates, closing_prices - opening_prices, 0.8,
       opening_prices, color=fc, edgecolor=ec)
# 自動調整水平坐標軸的日期標簽
mp.gcf().autofmt_xdate()
mp.show()

 獲取到的 aapl.csv 數據:

  

 運行效果:

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM