目錄:
3. 將多個曲線圖繪制在一個table區域中:對象形式創建表圖
4. 散點圖(plt.scatter(x,y,c='rgyb'))
一、Matplotlib基礎知識
# 繪制線 plt.plot(x1,y1,x2,y2) # 網格線 plt.grid(True) axes.grid(color,ls,lw,alpha) # 獲取坐標系 plt.subplot(n1,n2,n3) # 坐標軸標簽 plt.xlabel() plt.ylabel() # 坐標系標題 plt.title() # 圖例 plt.legend([names],ncol=2,loc=1) plt.plot(label='name') # 線風格 -- -. : None step # 圖片保存 figure.savefig() # 點的設置 marker markersize markerfacecolor markeredgecolor\width # 坐標軸刻度 plt.xticks(刻度列表,刻度標簽列表) plt.yticks() # axes.set_xticks(刻度列表) axes.set_xticklabels(刻度標簽列表)
Matplotlib中的基本圖表包括的元素
x軸和y軸 axis
水平和垂直的軸線
x軸和y軸刻度 tick
刻度標示坐標軸的分隔,包括最小刻度和最大刻度
x軸和y軸刻度標簽 tick label
表示特定坐標軸的值
繪圖區域(坐標系) axes
實際繪圖的區域
坐標系標題 title
實際繪圖的區域
軸標簽 xlabel ylabel
實際繪圖的區域
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pandas import Series,DataFrame
1. 包含單條曲線的圖
注意:y,x軸的值必須為數字
1.1 繪制直線
x=[1,2,3,4,5]
y=[2,4,6,8,10]
plt.plot(x,y)

1.2 繪制拋物線
x = np.linspace(-np.pi,np.pi,num=20)
y = x**2
plt.plot(x,y)

1.3 繪制正弦曲線圖
x
y = np.sin(x)
plt.plot(x,y)

2. 包含多個曲線的圖
2.1 連續調用多次plot函數
plt.plot(x,y)
plt.plot(x+2,y+3)

2.2 也可以在一個plot函數中傳入多對X,Y值,在一個圖中繪制多個曲線
plt.plot(x,y,x+1,y-2)

3. 將多個曲線圖繪制在一個table區域中:對象形式創建表圖
a=plt.subplot(row,col,loc) 創建曲線圖
a.plot(x,y) 繪制曲線圖
ax1 = plt.subplot(221) # 2 兩行 2 兩列 1 位置
ax1.plot(x,y)
ax2 = plt.subplot(2,2,2)
ax2.plot(x,y)
ax3 = plt.subplot(2,2,3)
ax3.plot(x,y)
ax4 = plt.subplot(2,2,4)
ax4.plot(x,y)

4. 網格線 plt.grid(XXX)
參數:
- axis - color:支持十六進制顏色 - linestyle: -- -. : - alpha 透明度 ,例:plt.plot(x,y,c='red',alpha=0.7)
plt.plot(x,y)
plt.grid(axis='both',c='blue')

5. 坐標軸界限
axis方法:設置x,y軸刻度值的范圍
plt.axis([xmin,xmax,ymin,ymax])
plt.plot(x,y)
plt.axis([-6,6,-2,2])
#plt.axis('off') # 關閉坐標軸

設置畫布比例:plt.figure(figsize=(a,b)) a:x刻度比例 b:y刻度比例 (2:1)表示x刻度顯示為y刻度顯示的2倍
plt.figure(figsize=(6,6))
plt.plot(x,y)

6. 坐標軸標簽
s 標簽內容
color 標簽顏色
fontsize 字體大小
rotation 旋轉角度
plt的xlabel方法和ylabel方法 title方法
plt.plot(x,y)
plt.xlabel('aaa')
plt.ylabel('bbb')
plt.title('ccc')

7. 圖例(legend方法)
7.1 兩種傳參方法:
分別在plot函數中增加label參數,再調用plt.legend()方法顯示
直接在legend方法中傳入字符串列表
plt.plot(x,y,label='aaa')
plt.plot(x+2,y+3,label='bbb')
plt.legend(loc=0,ncol=2)

7.2 legend的參數
7.2.1 loc參數
loc參數用於設置圖例標簽的位置,一般在legend函數內
matplotlib已經預定義好幾種數字表示的位置

7.2.2 ncol參數
ncol控制圖例中有幾列,在legend中設置ncol
二、保存圖片
1. 使用figure對象的savefig函數來保存圖片
fig = plt.figure()---必須放置在繪圖操作之前
figure.savefig的參數選項
filename : 含有文件路徑的字符串或Python的文件型對象。圖像格式由文件擴展名推斷得出,例如,.pdf推斷出PDF,.png推斷出PNG (“png”、“pdf”、“svg”、“ps”、“eps”……)
dpi : 圖像分辨率(每英寸點數),默認為100
facecolor : 打開保存圖片查看 圖像的背景色,默認為“w”(白色)
fig = plt.figure()
plt.plot(x,y,label='aaa')
plt.plot(x+2,y+3,label='bbb')
plt.legend(loc=0,ncol=2)
fig.savefig('./123.png',dpi=500)

2. 設置plot的風格和樣式
plot語句中支持除X,Y以外的參數,以字符串形式存在,來控制顏色、線型、點型等要素,語法形式為:
plt.plot(X, Y, 'format', ...)
2.1 顏色
2.1.1 參數color或c
2.1.2 顏色值的方式:
別名: color='r'
合法的HTML顏色名 : color = 'red'

HTML十六進制字符串 : color = '#eeefff'
歸一化到[0, 1]的RGB元組 : color = (0.3, 0.3, 0.4)
2.2 透明度
alpha參數
2.3 線型
參數linestyle或ls

plt.plot(x,y,ls='steps',lw=10)

2.4 線寬
linewidth或lw參數
2.5 點型
marker 設置點形
markersize 設置點形大小

plt.plot(x,y,marker='d',markersize=10)

三、2D圖形
1. 直方圖(plt.hist())
是一個特殊的柱狀圖,又叫做密度圖。
直方圖的參數只有一個x,不像條形圖需要傳入x,y
plt.hist()的參數
bins : 直方圖的柱數,可選項,默認為10
color : 指定直方圖的顏色。可以是單一顏色值或顏色的序列。如果指定了多個數據集合,例如DataFrame對象,顏色序列將會設置為相同的順序。如果未指定,將會使用一個默認的線條顏色
orientation : 通過設置orientation為horizontal創建水平直方圖。默認值為vertical
data = [1,2,3,3,4,2,5]
plt.hist(data,bins=10)

返回值 :
1: 直方圖向量,是否歸一化由參數normed設定
2: 返回各個bin的區間范圍
3: 返回每個bin里面包含的數據,是一個list
2. 條形圖(plt.bar())
參數:第一個參數是索引。第二個參數是數據值。第三個參數是條形的寬度
條形圖有兩個參數x,y
width 縱向設置條形寬度
height 橫向設置條形高度
barh() : 水平條形圖
num = [1,2,3,4,5]
count = [2,4,6,8,10]
plt.barh(num,count)

3. 餅圖(plt.pie())
餅圖也只有一個參數x
pie()
餅圖適合展示各部分占總體的比例,條形圖適合比較各部分的大小
餅圖陰影、分裂等屬性設置
#labels參數設置每一塊的標簽;
#labeldistance參數設置標簽距離圓心的距離(比例值)
#autopct參數設置比例值小數保留位(%.3f%%);
#pctdistance參數設置比例值文字距離圓心的距離
#explode參數設置每一塊頂點距圓心的長度(比例值,列表);
#colors參數設置每一塊的顏色(列表);
#shadow參數為布爾值,設置是否繪制陰影
#startangle參數設置餅圖起始角度
plt.pie([0.2,0.5])

arr=[11,22,31,15]
plt.pie(arr,labels=['a','b','c','d'])

# labeldistance參數設置標簽距離圓心的距離(比例值)
arr=[11,22,31,15]
plt.pie(arr,labels=['a','b','c','d'],labeldistance=0.3)

# autopct參數設置比例值小數保留位(%.3f%%);
arr=[11,22,31,15]
plt.pie(arr,labels=['a','b','c','d'],labeldistance=0.3,autopct='%.6f%%')

# explode參數設置每一塊頂點距圓心的長度(比例值,列表);
arr=[11,22,31,15]
plt.pie(arr,labels=['a','b','c','d'],labeldistance=0.3,shadow=True,explode=[0.2,0.3,0.2,0.4])

# startangle參數設置餅圖起始角度
arr=[11,22,31,15]
plt.pie(arr,labels=['a','b','c','d'],startangle=50)

注:%m.nf m 占位 n 小數點后保留幾位 f 是以float格式輸出
4. 散點圖(plt.scatter(x,y,c='rgyb')):因變量隨自變量而變化的大致趨勢
散點圖需要兩個參數x,y,但此時x不是表示x軸的刻度,而是每個點的橫坐標
x = np.random.randint(0,10,size=(20,))
y = np.random.randint(0,10,size=(20,))
plt.scatter(x,y,c='rgyb') # c='rgyb'表示設置不同的散點顏色

x = [1,2,3,4,5]
y = [2,4,6,8,10]
plt.scatter(x,y)

案例:城市氣候與海洋的關系研究
# 導包:
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默認字體
mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負號'-'顯示為方塊的問題
# 導入數據各個海濱城市數據:
ferrara1 = pd.read_csv('./ferrara_150715.csv')
ferrara2 = pd.read_csv('./ferrara_250715.csv')
ferrara3 = pd.read_csv('./ferrara_270615.csv')
ferrara=pd.concat([ferrara1,ferrara2,ferrara3],ignore_index=True)
torino1 = pd.read_csv('./torino_150715.csv')
torino2 = pd.read_csv('./torino_250715.csv')
torino3 = pd.read_csv('./torino_270615.csv')
torino = pd.concat([torino1,torino2,torino3],ignore_index=True)
mantova1 = pd.read_csv('./mantova_150715.csv')
mantova2 = pd.read_csv('./mantova_250715.csv')
mantova3 = pd.read_csv('./mantova_270615.csv')
mantova = pd.concat([mantova1,mantova2,mantova3],ignore_index=True)
milano1 = pd.read_csv('./milano_150715.csv')
milano2 = pd.read_csv('./milano_250715.csv')
milano3 = pd.read_csv('./milano_270615.csv')
milano = pd.concat([milano1,milano2,milano3],ignore_index=True)
ravenna1 = pd.read_csv('./ravenna_150715.csv')
ravenna2 = pd.read_csv('./ravenna_250715.csv')
ravenna3 = pd.read_csv('./ravenna_270615.csv')
ravenna = pd.concat([ravenna1,ravenna2,ravenna3],ignore_index=True)
asti1 = pd.read_csv('./asti_150715.csv')
asti2 = pd.read_csv('./asti_250715.csv')
asti3 = pd.read_csv('./asti_270615.csv')
asti = pd.concat([asti1,asti2,asti3],ignore_index=True)
bologna1 = pd.read_csv('./bologna_150715.csv')
bologna2 = pd.read_csv('./bologna_250715.csv')
bologna3 = pd.read_csv('./bologna_270615.csv')
bologna = pd.concat([bologna1,bologna2,bologna3],ignore_index=True)
piacenza1 = pd.read_csv('./piacenza_150715.csv')
piacenza2 = pd.read_csv('./piacenza_250715.csv')
piacenza3 = pd.read_csv('./piacenza_270615.csv')
piacenza = pd.concat([piacenza1,piacenza2,piacenza3],ignore_index=True)
cesena1 = pd.read_csv('./cesena_150715.csv')
cesena2 = pd.read_csv('./cesena_250715.csv')
cesena3 = pd.read_csv('./cesena_270615.csv')
cesena = pd.concat([cesena1,cesena2,cesena3],ignore_index=True)
faenza1 = pd.read_csv('./faenza_150715.csv')
faenza2 = pd.read_csv('./faenza_250715.csv')
faenza3 = pd.read_csv('./faenza_270615.csv')
faenza = pd.concat([faenza1,faenza2,faenza3],ignore_index=True)
# 去除沒用的列:
city_list = [ferrara,torino,mantova,milano,ravenna,asti,bologna,piacenza,cesena,faenza]
for city in city_list:
city.drop(labels='Unnamed: 0',axis=1,inplace=True)
# 顯示最高溫度與離海遠近的關系(觀察多個城市)
city_max_temp = [] # 10個城市的最高溫度列表
city_dist = [] # 10個城市與海洋距離的列表
# 向兩個列表中加入相應的值
for city in city_list:
max_temp = city['temp'].max()
city_max_temp.append(max_temp)
dist = city['dist'][0]
city_dist.append(dist)
# 繪制散點圖
plt.scatter(city_dist,city_max_temp)
plt.xlabel('距離')
plt.ylabel('最高溫度')
plt.title('距離和溫度之間的關系圖')

觀察發現,離海近的可以形成一條直線,離海遠的也能形成一條直線。
- 分別以100公里和50公里為分界點,划分為離海近和離海遠的兩組數據(近海:小於100 遠海:大於50)
#找出所有的近海城市(溫度和距離)
np_city_dist = np.array(city_dist)
np_city_max_temp = np.array(city_max_temp)
near_condition = np_city_dist < 100
near_city_dist = np_city_dist[near_condition]
near_city_max_temp = np_city_max_temp[near_condition]
# 繪制近海城市的溫度距離散點圖
plt.scatter(near_city_dist,near_city_max_temp)

機器學習
- 算法模型對象:特殊的對象.在該對象中已經集成好了一個方程(還沒有求出解的方程). - 模型對象的作用:通過方程實現預測或者分類 - 樣本數據(df,np)(樣本集:用於對機器學習算法模型對象進行訓練。樣本集通常為一個DataFrame。): - 特征數據:自變量(特征數據的變化會影響目標數據的變化。通常為多列。)結果。通常為一列。
- 目標(標簽)數據:因變量 ()
- 模型對象的分類:
- 有監督學習:模型需要的樣本數據中存在特征和目標
- 無監督學習:模型需要的樣本數據中存在特征
- 半監督學習:模型需要的樣本數據部分需要有特征和目標,部分只需要特征數據
- sklearn模塊:封裝了多種模型對象.
導入sklearn,建立線性回歸算法模型對象
# 1.導包
from sklearn.linear_model import LinearRegression
# 2.實例化模型對象
linner = LinearRegression()
# 3.提取樣本數據(上面求得的)
near_city_dist
near_city_max_temp
# 4.訓練模型(使用樣本數據對模型進行訓練)
linner.fit(near_city_dist.reshape(-1,1),near_city_max_temp)
輸出:LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
# 5.預測(使用模型進行預測)
linner.predict(38)
輸出:array([33.16842645])
# 對模型進行精准度的評分
linner.score(near_city_dist.reshape(-1,1),near_city_max_temp)
輸出:0.77988083971852
# 繪制回歸曲線
x = np.linspace(10,70,num=100)
y = linner.predict(x.reshape(-1,1))
plt.scatter(near_city_dist,near_city_max_temp)
plt.scatter(x,y,marker=1)

