1. 程式人生 > >3.Matplotlib資料視覺化基礎(上)

3.Matplotlib資料視覺化基礎(上)

筆記說明:本文是我的學習筆記,大部分內容整理自 黃紅梅,張良均等.Python資料分析與應用[M].北京:人民郵電出版社,2018:52-77. 還有部分片斷知識來自網路搜尋補充。
視覺化這塊的內容我以後會專門學習一本參考書然後整理筆記的,現在僅僅是整理上述參考書的一個章節的基礎知識。

注:寫在最前面。這塊知識是視覺化這一大塊的內容,很多、很細緻,我在整理這個筆記的時候就會不自覺一直在網上搜索更多的知識,對我現階段而言太浪費時間了,因為我的主要方向不是做視覺化的,所以我在後面的筆記裡面僅僅呈現出開頭提到的那個參考工具書的第三章視覺化基礎的筆記整理
關於視覺化更詳細的部分在以後我係統學習完我的知識之後回過頭我會整理一本專門講python視覺化的工具書的筆記

的。書已經買好了,就是!!暫時不會看那本書!!

推薦部落格:這個人的部落格https://blog.csdn.net/sinat_36219858/article/details/79800460

文章目錄

0.本文的資料

CSDN的資料不可以免費共享,至少要一個金幣,有能力的就去下載一下資料下載連結CSDN資料。你方便的底下頭評論留言,留下郵箱號,我看到之後就會把資料發給你,或者你可以在這本書的出版社網站人民郵電出版社教育社群或者“泰迪杯資料探勘比賽”泰迪杯數瑞思的網站上找這本書的附帶資源,都是免費下載的。

1.繪圖基礎語法與常用引數

1.1 pyplot

pyplot繪圖的方式類似R語言裡面的ggplot,是建立多個圖層來完成同一幅圖中繪製多個圖形。
因此需要在每建立一個圖層之後就新增標題、x軸、x軸的刻度範維、y軸、y軸的刻度範圍,然後新增圖形,新增圖例,儲存顯示。

1.1.1建立畫布和子圖

  • 在一幅圖時可以省略
  • plt.figure:空白畫布
  • figure.add_subplot(‘行’,‘列’,‘選中的子圖編號’)

1.1.2 新增畫布內容

  • 具體引數詳見help(func)
  • plt.title:標題
  • plt.xlabel:x軸名稱
  • plt.ylabel:y軸
  • plt.xlim:x軸的範圍
  • plt.ylim:y軸範圍
  • plt.xticks:第一個引數為範圍,陣列型別;第二個引數是標籤,第三個是控制標籤,
    遵循text協議,具體參照matplotlib.text
  • plt.yticks:同上
  • plt.legend:圖例

1.1.3 儲存與顯示圖形

  • plt.savafig:儲存
  • plt.show:在本機顯示

上個栗子!

## 一個圖
help(plt.plot)
import numpy as np
import matplotlib.pyplot as plt
data = np.arange(11)
plt.title(u'隨便畫一條看看')
plt.xlim((0,11))
plt.xlabel(u'X軸名字')
plt.ylim((0,105))
plt.ylabel(u'y軸名字')
plt.xticks(ticks=range(0,12))
plt.yticks(range(0,105,10))
plt.plot(data,data**2)
plt.legend('y=x^2')
plt.savefig('D:\\codes\\python\\image\\plot1.png')
plt.show()

## 兩個圖
# -*- coding: utf-8 -*-
rad=np.arange(0,np.pi*2,0.01)
p1=plt.figure(figsize=(15,7),dpi=111)
pic1=p1.add_subplot(1,2,1) #一行兩列的第一幅圖
plt.title(u'會不會亂碼?')
plt.xlabel('x')
plt.xlim((0,1))
plt.xticks(np.arange(0,1.1,0.1))
plt.ylim((0,1))
plt.ylabel('y')
plt.yticks(np.arange(0,1.1,0.1))
plt.plot(rad,rad**2)
plt.plot(rad,rad**4)
plt.plot(rad,rad*0+0.5) ## 第二個y引數一定要包含x。只寫0.5的話,畫不出來這條直線
plt.legend(['y=x^2','y=x^4'])

pic2=p1.add_subplot(1,2,2) #一行兩列的第一幅圖
plt.title('sin & cos')
plt.xlabel('x')
plt.xlim((0,np.pi*2))
plt.xticks(np.arange(0,np.pi*2+1,np.pi/2))
plt.ylim((-1,1))
plt.ylabel('y')
plt.yticks(np.arange(-1,1.5,0.5))
plt.plot(rad,np.sin(rad))
plt.plot(rad,np.cos(rad))
plt.legend(['sin','cos'])
plt.savefig('D:\\codes\\python\\image\\plot2.png')
plt.show()

中文還是亂碼,開頭我已經宣告utf8編碼了~~
plt.plot(rad,rad*0+0.5) 第二個y引數一定要包含x。只寫0.5的話,畫不出來這條直線

1.2 設定動態rc引數

rc引數修改之後,繪圖時使用的預設引數就會發生改變

x=np.arange(0,np.pi*6+0.1,0.1)
y=np.sin(x)
plt.plot(x,y,label='$sin(x)$')# $ 的作用就是告訴電腦這是個字串
plt.title("sin")
plt.rcParams['lines.linestyle']='--'
plt.savefig('D:\\codes\\python\\image\\plot4.png') 
plt.show()

這邊有個很有意思的邏輯,就是其實這個savefig並不是必須要有的,但是一旦寫好,
plt.show出來的就是上述名字的照片,本例題就是plot4,然後修改rc引數後,
show出來的圖片並不會更改,依然是plot4,所以修改完rc引數之後要修改照片的名字,儲存新的照片。。

rc引數 解釋 取值
lines.linewidth 線條寬度 0~10,預設1.5
lines.linestyle 線條樣式 “-”,“–”,“-.”,“:”預設是“-”
lines.marker 線條上點的形狀 “o”“D”“h”“.”“,”“S”等20種
lines.markersize 點的大小 0~10,預設1
lines.marker 意義 lines.marker 意義
o 圓圈 .
D 菱形 S 正方形
h 六邊形1 H 六邊形2
* 星號 d 小菱形
- 水平線 v 一角向下的三角形
8 八邊形 < 一角向左的三角形
p 五邊形 > 一角向右的三角形
, 畫素 ^ 一角向上的三角形
+ 加號 \ 豎線
None x X

劃重點!中文的支援
pyplot字型不支援中文,不是編碼的問題,需要設定一個引數

x=np.arange(0,np.pi*6+0.1,0.1)
y=np.sin(x)
plt.plot(x,y,label='$sin(x)$')# $ 的作用就是告訴電腦這是個字串
plt.title("sin這個中文就可以顯示了")
plt.rcParams['lines.linestyle']='-.'
plt.rcParams['font.sans-serif']='SimHei'#設定中文字型
plt.rcParams['axes.unicode_minus']=False #防止座標軸中文顯示錯誤
plt.show()

2.散點圖和折線圖

2.1 散點圖

help(plt.scatter)
scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None,   
        vmin=None, vmax=None, alpha=None, linewidths=None,   
        verts=None, edgecolors=None, *, data=None, **kwargs)
引數 說明
x,y 接收array,表示x,y對應的資料
s 接收數值或者一維陣列,指定點的大小,若傳入一維陣列,則表示每個點的大小
c 接收顏色引數或者一維陣列
marker 接收待定string,表示繪製的點的型別
alpha 接收0~1的小數,表示點的透明度
顏色 說明 顏色 說明
b 藍色 m 品紅
g 綠色 y 黃色
r 紅的 k 黑色
c 青色 w 白色

一個栗子!

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']='SimHei'
plt.rcParams['axes.unicode_minus']=False
data=np.load("D:\\codes\\python\\國民經濟核算季度資料.npz")
name=data['columns']
values=data['values']
plt.figure(figsize=(9,7))
plt.scatter(values[:,0],values[:,2],marker='o')
np.max(values[:,2])
plt.xlabel("年份")
plt.ylabel("生產總值(億元)")
plt.ylim((0,225000))
plt.xticks(range(0,70,4),values[range(0,70,4),1],rotation=45)
# rotation標籤旋轉角度
plt.title("2000~2017各季度國民生產總值散點圖")
plt.show()

###繪製多個散點
plt.figure(figsize=(9,7))
plt.scatter(values[:,0],values[:,3],marker='o',c='red')
plt.scatter(values[:,0],values[:,4],marker='D',c='green')
plt.scatter(values[:,0],values[:,5],marker='>',c='blue')
plt.xlabel('年');plt.ylabel('生產總值(億)')
plt.xticks(range(0,70,4),values[range(0,70,4),1],rotation=45)
plt.title("打字好累啊,來回切換輸入法")
plt.legend(["一產業","二產業","三產業"])
plt.show()