視覺化庫----Matplotlib+Pandas高階篇及應用
阿新 • • 發佈:2019-02-19
以下文件的原始檔,我做成網頁
了,可以直接點選這裡
一、柱狀圖詳解
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度的位置開始畫
'''