指的是通過可視化表示來探索數據,他與數據分析緊密相關,而數據分析指的是使用代碼來探索數據集的規律和關聯,數據集可以是用一行代碼就能表示的小型數字列表,也可以是數千兆字節的數據。
舉例:
使用Matplotlib繪制簡單的圖表,我們只需要提供數,Matplotlib會完成這項工作:
import matplotlib.pyplot as plt#導入pyplot模塊,其中包含很多用於生成圖表函數
squares=[1,4,9,16,25]
fig,ax=plt.subplots()#fig表示整張圖片,ax表示圖片中的各個圖表
#調用函數subplots
ax.plot(squares)#調用方法plot(),它嘗試根據給定的數據以有意義的方式繪制圖表
plt.show()#打開Matplotlib查看器並顯示繪制的圖表
繪制結果如下圖所示:
現在我們通過修改代碼,來改善該圖表的可讀性:
import matplotlib.pyplot as plt
squares=[1,4,9,16,25]
fig,ax=plt.subplots()
ax.plot(squares,linewidth=3)
ax.set_title("平方數",fontsize=24)
ax.set_xlabel("value",fontsize=14)
ax.set_ylabel("值的平方",fontsize=14)
ax.tick_params(axis='both',labelsize=14)
plt.show()
通過輸出結果我們發現,軸的標題為英文的被很好地顯示出來,而軸的標題為中文的卻是以亂碼的形式被顯示出來。
為什麼會出現亂碼呢?
這是由於用戶配置的原因,matlab找不到默認字體,於是使用了Helvetica字體。
如何解決這個問題呢?
我們可通過修改plt的配置參數來滿足畫圖需求,修改參數方法如下:
plt.rcParams[‘配置參數’]=[修改值]
上述實例可修改為:
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#運行配置參數中的字體(font)為黑體(SimHei)
squares=[1,4,9,16,25]
fig,ax=plt.subplots()
ax.plot(squares,linewidth=3)
ax.set_title("平方數",fontsize=24)
ax.set_xlabel("value",fontsize=14)
ax.set_ylabel("值的平方",fontsize=14)
ax.tick_params(axis='both',labelsize=14)
plt.show()
此時呈現出來的圖表的線條更加粗壯,閱讀起來也容易的多了
新細明體:PMingLiU
細明體:MingLiU
標楷體:DFKai-SB
黑體:SimHei
宋體:SimSun
新宋體:NSimSun
仿宋:FangSong
楷體:KaiTi
仿宋_GB2312:FangSong_GB2312
楷體_GB2312:KaiTi_GB2312
微軟正黑體:Microsoft JhengHei
微軟雅黑體:Microsoft YaHei
可選擇適合的字體顯示中文
圖像變得更加清晰了之後,相信細心的小伙伴已經看出了我們繪制的數據是有問題的,折線所顯示的4.0的平方和竟然為25!
下面我們來修復這個問題,現在我們向plot()提供一系列數,它假設第一個數據對應的x軸坐標為0,但這裡第一個點對應的x值為1,為改變這種默認行為,可向plot()同時提供輸入和輸出值。
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#運行配置參數中的字體(font)為黑體(SimHei)
input_values=[1,2,3,4,5]#提供平方數對應的值
squares=[1,4,9,16,25]
fig,ax=plt.subplots()
ax.plot(input_values,squares,linewidth=3)
---snip---
現在繪制數據呈現的圖表即是正確的。
Matplotlib提供了很多已經定義好的樣式,例如:背景色,網格線,線條粗細,字體,字號等的設置。
舉例:
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#運行配置參數中的字體(font)為黑體(SimHei)
plt.rcParams['axes.facecolor']='yellow'#設置圖表的背景顏色為黃色
plt.rcParams['figure.facecolor']='green'#設置整張圖片的背景顏色為綠色
---snip---
import matplotlib.pyplot as plt
from matplotlib import style
print(plt.style.available)
['Solarize_Light2', '_classic_test_patch', '_mpl-gallery', '_mpl-gallery-nogrid', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']
對於數據涉及范圍較大的情況下,如果我們想實現不同范圍內的數據使用不同的顏色,此時就可以使用scatter()來設置單個點,使用方法:
ax.scatter(x坐標,y坐標)
import matplotlib.pyplot as plt
plt.style.use("seaborn")#選用網格樣式
fig,ax=plt.subplots()
ax.scatter(2,4)#繪制我們傳遞的指定點(2,4)
plt.show()
ax.scatter(2,4,s=200)#通過第三個參數s,我們還可以指定點的尺寸大小
圖示如下:
import matplotlib.pyplot as plt
plt.style.use("seaborn-dark")
fig,ax=plt.subplots()
ax.scatter(2,4,s=200)
#axis表示x軸和y軸同時設置labelsize用於設置刻度線標簽的字體大小
ax.tick_params(axis='both',which="major",labelsize=14)#which一共三個參數['major','minor','both']
#默認是major表示主刻度,後面依次分布為次刻度及主次刻度都顯示
plt.show()
圖示如下:
要繪制一系列的點,可向scatter()傳遞兩個分別包含x值和y值的列表,如下圖示:
import matplotlib.pyplot as plt
#將要設置的值通過列表存儲起來
x_values=[1,2,3,4,5]
y_values=[1,4,9,16,25]
plt.style.use("seaborn")
fig,ax=plt.subplots()
ax.scatter(x_values,y_values,s=100)#將x_values和y_values中所包含的點都設置
plt.show()
如圖所示:
當繪制的點很多時,手工計算列表要包含的值效率會比較低,但好在Python可以通過循環幫助我們實現這一功能。
下面我們增加數據:
import matplotlib.pyplot as plt
x_values=range(1,1001)#使用循環確定橫坐標的值
y_values=[x**2 for x in x_values]#縱坐標的值為x的平方,而x為x_values裡面的值
plt.style.use("seaborn")
fig,ax=plt.subplots()
ax.scatter(x_values,y_values,s=100)
ax.axis([0,1100,0,1100000])#設置每個坐標軸的取值范圍:x的取值范圍:0---1100,y的取值范圍0----1 100 000
plt.show()
要修改數據點的顏色,可向scatter()傳遞參數c,並將其設置為要使用的顏色的名稱(放在引號內),如下所示:
import matplotlib.pyplot as plt
x_values=range(1,1001)
y_values=[x**2 for x in x_values]
plt.style.use("seaborn")
fig,ax=plt.subplots()
ax.scatter(x_values,y_values,c='yellow',s=10)#c="需要設置的顏色”
plt.show()
此外,我們還可使用RGB顏色模式自定義顏色,要指定自定義顏色,可傳遞參數c,並將其設置為一個元祖,其中包含三個0-1的數值,分別表示紅色,綠色和藍色的分量。
舉例:
ax.scatter(x_values,y_values,c=(1,0.3,0。6),s=10)#通過調整c中三個參數的值來調節顏色的深度,這三個參數分別表示紅色,綠色和藍色的分量
#值越接近0,指定的顏色越深,值越接近1,指定的顏色越淺
顏色映射是一系列顏色,從起始顏色漸變到結束顏色,在可視化中,顏色映射用於突出數據的規律,例如,你可以用較淺的值來顯示較小的值,並且使用較深的值顯示較大的值。
模塊pyplot內置了一組顏色映射,要使用這些顏色映射,需要告訴pyplot該如何設置數據集中每個點的顏色。
舉例:
import matplotlib.pyplot as plt
x_values=range(1,1001)
y_values=[x**2 for x in x_values]
plt.style.use("seaborn")
fig,ax=plt.subplots()
ax.scatter(x_values,y_values,c=y_values,cmap=plt.cm.Reds,s=10)#使用參數cmap告訴pyplot使用那個顏色進行映射
#將y值較小的設置為粉色,較大的設置為紅色
plt.show()
如下圖所示:
如果你還想了解pyplot中所有的顏色映射,可通過訪問Matplotlib網站主頁,單擊Examples,向下滾動到color,再單擊Colormaps reference
訪問主頁:
在Examples中找到color,再點擊color reference:
各種顏色顯而易見:
要讓程序自動將圖表保存到文件中,可將調用plt.savefig():
#第一個參數(squres_plot.png)指定以什麼文件名保存圖表,執行代碼後,該圖片會被保存到該項目的目錄下
#第二個參數指定將圖表多余的空白區域裁剪掉,如果想保留圖表周圍多余的空白區域,只需要省略這個實參即可
plt.savefig("squres_plot.png",bbox_inches="tight")
打開改文件,如下圖所示:
隨機漫步是這樣行走得到路徑的:每次行走都是完全隨機的,沒有明確的方向,結果是由一系列隨機決策決定的,你可以將隨機漫步看作螞蚱在暈頭轉向的情況下,每次都沿隨機的方向前行所經過的路徑。
那麼它到底有什麼作用呢?
通過編寫代碼我們可以,模擬現實世界的很多情形,比如:漂浮在水滴上的花粉因不斷受到水分子的擠壓而在水上面移動,而水滴中的分子運動也是隨機的,因此花粉在水面上的運動路徑猶如隨機漫步。
為模擬隨機漫步,將創建一個名為RandomWalk的類,它隨機的選擇前進方向,這個類具有三個屬性:一個是存儲隨機漫步次數的變量,其他兩個是列表,分別存儲隨機漫步經過的每個點的x坐標和y坐標。
RandomWalk類只包含兩個方法:方法__init__()和fill_walk()
舉例:
from random import choice
class RandonWalk:#表示隨機漫步數據的類
def __init__(self,num_points=5000):#初始化隨機漫步的屬性
self.num_points=num_points
#所有的隨機漫步都從坐標軸原點出發
self.x_values=[0]
self.y_values=[0]
使用RandomWalk類的另外一個方法,fill——walk()來決定每次漫步的方向。
舉例:
def fill_walk(self):
#計算隨機漫步包含的所有點:決定上向左右四個方向和行走的距離
while len(self.x_values,)<self.num_points:#不斷漫步,直到列表達到指定的長度
#決定前進方向以及沿這個方向前進的距離
x_direction=choice([1,-1])
x_distance=choice([0,1,2,3,4])
#如果x_step為正向右移動,為負向左移動,為零垂直移動
x_step=x_direction*x_distance#距離*方向,確定x軸移動的距離
y_direction=choice([1,-1])
y_distance=choice([0,1,2,3,4])
#如果y_step為正向上移動,為負向下移動,為0水平移動
y_step=y_direction*y_distance#同理如上
if x_step==0 and y_step==0:#拒絕原地踏步
continue
#將x_step/y_step與x_values/y_values中的最後一個值相加,計算下一個點的x值和y值
x=self.x_values[-1]+x_step
y=self.y_values[-1]+y_step
self.x_values.append(x)#將計算好的值附加到列表中
self.y_values.append(y)
代碼:
#導入pyplot模塊和RandomWalk類
import matplotlib.pyplot as plt
from project1 import RandomWalk
#創建關於RandomWalk的實例,並調用其中的方法
rw=RandomWalk()
rw.fill_walk()
plt.style.use("classic")#選擇內置樣式“classic”
fig,ax=plt.subplots()
ax.scatter(rw.x_values,rw.y_values,s=15,c="green")
plt.show()
要保證不使用多次運行程序的辦法而實現用前面的代碼模擬多次隨機漫步,一種辦法是將這些代碼放在一個循環中:
操作如下:
keep_running=input("Make another walk?(y/n):")
if keep_running=='n':
break
添加該語句後,當進行一次隨機漫步之後,在對話框就會出現:
Make another walk?(y/n):y#輸入y,再進行一次隨機漫步
Make another walk?(y/n):n#輸入n,則結束漫步
通過上圖呈現的隨機漫步的元素,我們不難發現元素分布非常的凌亂,這樣就會導致我們在分析數據的時候很麻煩。
我們可將比較特殊的元素進行處理,比如漫步起點,終點的等等。
操作如下:
---snip---
fig,ax=plt.subplots()
point_numbers=range(rw.num_points)
ax.scatter(rw.x_values,rw.y_values,s=15,c=point_numbers,cmap=plt.cm.Blues,edgecolors="none")
#將參數c設置為point_numbers,指定使用顏色映射Blues,並將輪廓刪除
plt.show()
---snip---
如圖所示:
操作如下:
#突出起點和終點,通過使用scatter(),設置單獨的點
ax.scatter(0,0,c="green",edgecolors="none",s=100)#設置起點的值
ax.scatter(rw.x_values[-1],rw.y_values[-1],c='red',edgecolor="none",s=100)#設置終點的值
如圖所示:
要隱藏坐標軸,可使用如下代碼:
#將每條坐標軸的可見性都設置為Faslse
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
輸出如圖所示:
為提供更多的數據,我們可在創建實例的時候增大num_points的值,並在繪圖時調整每個點的大小:
import matplotlib.pyplot as plt
from project1 import RandomWalk
while True:
rw=RandomWalk(50_000)#描繪5w個點
rw.fill_walk()
plt.style.use("classic")
fig,ax=plt.subplots()
point_numbers=range(rw.num_points)
ax.scatter(rw.x_values,rw.y_values,s=15,c=point_numbers,cmap=plt.cm.Blues,edgecolors="none")
ax.scatter(0,0,c="green",edgecolors="none",s=1)#將點的大小設置為1
---snip---
通過直接指定圖表的尺寸大小,即給figsize指定一個元祖,通過參數dpi向plt.subplots()傳遞該分辨率。
舉例:
fig,ax=plt.subplots(figsize=(10,6),dpi=128)
輸出結果如下圖所示: