1. 程式人生 > >視覺化庫----Matplotlib+Pandas高階篇及應用

視覺化庫----Matplotlib+Pandas高階篇及應用

以下文件的原始檔,我做成網頁了,可以直接點選這裡

一、柱狀圖詳解

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["font.sans-serif"]=['SimHei']  # 用於正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False  # 用來正常顯示負號

#再論柱狀圖
#建立一個畫板
plt.figure(1)
# 確定繪圖範圍,由於只需要畫一張圖,所以我們將整張白紙作為繪圖的範圍
# 111: 表示設定繪圖範圍為1行1列,最後一個1代輸出到第1塊畫布上目前只有1塊)
ax1=plt.subplot(111) #資料準備 #y軸資料 data = np.array([15,10,25,15]) width=0.5#柱狀圖寬度 #x軸資料 x_bar = np.arange(4) rect=ax1.bar(x_bar,data,width=width,color="lightblue") #為柱狀圖新增高度值 for rec in rect: x=rec.get_x() #獲取所有x座標的值 height=rec.get_height() #獲取所在高度的值 print(x,height) ax1.text(x+0.2,1.02*height,str(height)+'W'
) #在指定位置寫上高度的值 #設定x的座標 ax1.set_xticks(x_bar) ax1.set_xticklabels(["第一季度","第二季度","第三季度","第四季度"]) ax1.set_xlabel("季度") #設定Y的標籤 ax1.set_ylabel("銷量(單位:萬件)") ax1.set_title("2017年季度銷售量統計") ax1.grid(True) #是否顯示網格 ax1.set_ylim(0,28) #設定y的顯示範圍 ax1.spines["right"].set_color("none") ax1.spines["top"].set_color("none"
)

這裡寫圖片描述

二、#繪製多幅圖形subplot

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams["font.sans-serif"]=['SimHei']  # 用於正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False  # 用來正常顯示負號

plt.figure(figsize=(6,6),dpi=80) #建立畫布 ,dpi每個單位的畫素
plt.figure(1) # 建立第一個畫板(figure)
ax1=plt.subplot(211) # 劃分畫板為2 行 1 列,共 2 塊區域,並獲取當前畫板的第一個子圖(子塊)
plt.scatter([1, 2, 3],[2,4,7],marker="v",s=20) # 繪圖
ax2 = plt.subplot(212) # 獲取當前畫板的第二個子圖(子塊)
ax2.set_ylim(0,6) #設定y的顯示範圍
plt.plot([4, 5, 6]) # 繪圖



#建立第二個畫板,來畫圖
plt.figure(2)
x=np.arange(4)
y=np.array([12,13,15,10])
#繪製柱狀圖
ax3=plt.bar(x,y)
plt.title("第二個畫板")

plt.figure(1)  #切換到第一個畫板
plt.subplot(211) #切換到第一塊區域subplot(211)
ax1.set_title('第一個畫板(區域1)') # 做出211的標題
plt.subplot(212) #切換到第一塊區域subplot(211)
ax2.set_title('第一個畫板(區域2)') # 做出212的標題
# 調整每隔子圖之間的距離
plt.tight_layout()
plt.show()

這裡寫圖片描述
這裡寫圖片描述

三、載入資料

3.1、從檔案中載入資料

import matplotlib.pyplot as plt
import numpy as np
# import pandas as pd
import csv
plt.rcParams['font.sans-serif']=['SimHei']   #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False#用來正常顯示負號
#11111111111111111111載入csv檔案

#定義兩個空列表,存放x,y軸資料
x = []
y = []
with open('csv/matplotlib-demo.csv','r') as csvfile:
    plots = csv.reader(csvfile, delimiter=',')
    for row in plots:
        x.append(int(row[0]))
        y.append(int(row[1]))
plt.plot(x,y, label='模擬資料')
plt.xlabel('x')
plt.ylabel('y')
plt.title('演示從檔案載入資料')
plt.legend()
plt.show()

這裡寫圖片描述

3.2、從網頁中載入資料

mport json   #解析資料
import urllib
url = "https://api.douban.com/v2/book/1220562"
data = urllib.request.urlopen(url).read().decode()
data

#用josn將字串資料轉化為python字典
formatData = json.loads(data)
formatData

#獲取字典中key值為tags對應的資料
tags=formatData["tags"]
#用來存放的兩個列表
X=[]
Y=[]
#遍歷資料,取count作為y軸資料,name作為x軸
for tag in tags:
    print("{}----{}".format(tag["name"],tag["count"]))
    X.append(tag["name"])
    Y.append(tag["count"])
#繪製柱狀圖
plt.bar(X,Y,label="圖書熱搜詞")
plt.title("'圖書熱詞搜尋排名")
plt.xlabel('x軸-搜尋熱詞')
plt.ylabel('y軸-搜尋熱詞排名')
plt.legend()

這裡寫圖片描述

#用numpy載入csv資料
x,y  =np.loadtxt("csv/matplotlib-demo.csv",delimiter=",",unpack=True)
plt.plot(x,y,label="numpy載入資料")
plt.xlabel("X軸")
plt.ylabel("Y軸")
plt.title("'numpy載入資料過程")
plt.legend()

這裡寫圖片描述

四、Pandas+Matplotlib簡化資料視覺化

4.1、Series/DataFrame.plot()方法

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import csv
plt.rcParams['font.sans-serif']=['SimHei']   #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False#用來正常顯示負號
from pandas import Series,DataFrame

#111111111111111111111111111111111111111111111Series繪圖原理
#指定S的索引
s = pd.Series(np.random.randn(10).cumsum(),#累加
              index=np.arange(0,100,10))
#指定索引
index = np.arange(5)
ax=s.plot(label = "累加折線圖",title = "隨機累加折線圖")
ax.legend()
# ax.plot(title = "隨機累加折線圖")



#Series+!+!+!+!+!++!++!+!+!+!+!+!指定S的索引
s = pd.Series(np.random.randn(10).cumsum(),#累加
              index=np.arange(0,100,10))
#指定索引
index = np.arange(5)
ax=s.plot(label = "累加折線圖",title = "隨機累加折線圖",style="ko-")

ax.legend()
# ax.plot(title = "隨機累加折線圖")

這裡寫圖片描述

這裡寫圖片描述

#22222222222222222222222222222222222222DataFrame繪圖原理
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import csv
plt.rcParams['font.sans-serif']=['SimHei']   #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False#用來正常顯示負號
from pandas import Series,DataFrame
df=DataFrame(np.random.randn(10,6),index = np.arange(0,100,10),columns=list("ABCDEF"))
df.plot()

這裡寫圖片描述

#將Dataframe中各列的資料分配到不同的子圖中,是否共用x,y軸
df.plot(subplots=True,sharey=False)

這裡寫圖片描述

4.2、引數詳解

這裡寫圖片描述

這裡寫圖片描述

4.3、繪製多區域柱狀圖

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import csv
plt.rcParams['font.sans-serif']=['SimHei']   #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False#用來正常顯示負號
from pandas import Series,DataFrame
#建立畫板,獲取Axes物件
fig, axes = plt.subplots(2,1)#建立兩行一列的畫板
data = pd.Series(np.random.randn(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)  #在第二塊畫板
plt.show()
'''
alpha=0.7        寬度
'''

這裡寫圖片描述

4.4、繪製直方圖

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import csv
plt.rcParams['font.sans-serif']=['SimHei']   #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False#用來正常顯示負號
from pandas import Series,DataFrame
#讀取pandas中的excel檔案
df = pd.read_excel("excel/pandas-matplotlib.xlsx","Sheet1")
fig = plt.figure()
#建立畫布大小
fig.set_size_inches(10,8)

#在畫板上指定ax的繪圖板塊
ax = fig.add_subplot(111)
#畫直方圖
ax.hist(df['Age'], bins=7)  #平均分佈成七段
plt.title('年齡分佈')
plt.xlabel('Age')
plt.ylabel('人數')
plt.legend()

這裡寫圖片描述

4.5、箱型圖

fig2 = plt.figure()
ax=fig2.add_subplot(111)
ax.boxplot(df.Age)
plt.show()

這裡寫圖片描述

4.6、條形圖

# 條形圖
var = df.groupby('Gender').Sales.sum()
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_xlabel("性別")
ax1.set_ylabel("人數")
ax1.set_title("人數區分")
var.plot(kind="bar")

這裡寫圖片描述

4.7、堆疊圖

#堆疊圖
var2=df.groupby(['BMI','Gender']).Sales.sum().unstack()
var2.plot(kind="bar",stacked=True,  #是否堆疊
         color = ['y','b'])

這裡寫圖片描述

4.8、散點圖

fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(df['Age'], df['Sales'],s=100)
plt.show()

這裡寫圖片描述

4.9、氣泡圖


fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(df['Age'], df['Sales'], s=df['Income']) # 第三個變量表明根據收入氣泡的大小
plt.show()

這裡寫圖片描述

4.10、餅圖

#餅圖
temp = df.groupby(['Gender']).sum()

#單獨取出
x_list = temp['Sales']
label_list = temp.index
plt.axis('equal') #x與y軸是否相等,,(相當於是否是圓還是橢圓)
plt.pie(x_list, labels=label_list,shadow=True,#是否有陰影
        startangle=90,autopct='%1.1f%%',
       explode=[0,0.1])
plt.title('expense')
plt.show()

'''
plt.axis('equal')    #x與y軸是否相等,,(相當於是否是圓還是橢圓
shadow=True,         #是否有陰影
autopct='%1.1f%%     #顯示百分比資料
explode=[0,0.1]      #需要偏移的資料和大小
startangle=90        #從90度的位置開始畫
'''

這裡寫圖片描述