Matplotlib學習---用matplotlib畫散點圖,氣泡圖(scatterplot, bubble chart)
Matplotlib裏有兩種畫散點圖的方法,一種是用ax.plot畫,一種是用ax.scatter畫。
一. 用ax.plot畫
ax.plot(x,y,marker="o",color="black")
二. 用ax.scatter畫
ax.scatter(x,y,marker="o",s=sizes,c=colors)
ax.plot和ax.scatter的區別:
ax.plot:各散點彼此復制,因此整個數據集中所有的點只需配置一次顏色和大小。對大型數據集而言,ax.plot方法效率更高。
ax.scatter:靈活性高,可以單獨控制每個散點,使其具有不同的屬性(大小,填充顏色,邊框顏色等)。
下面利用Nathan Yau所著的《鮮活的數據:數據可視化指南》一書中的數據,學習畫圖。
數據地址:http://datasets.flowingdata.com/flowingdata_subscribers.csv (用於散點圖)
http://datasets.flowingdata.com/crimeRatesByState2005.csv(用於氣泡圖)
準備工作:先導入matplotlib和pandas,用pandas讀取csv文件,然後創建一個圖像和一個坐標軸
import pandas as pd from matplotlib import pyplot as plt subscriber=pd.read_csv(r"http://datasets.flowingdata.com/flowingdata_subscribers.csv")
fig,ax=plt.subplots()
讓我們先看看第一個數據文件的前5行:
Date Subscribers Reach Item Views Hits
0 01-01-2010 25047 4627 9682 27225
1 01-02-2010 25204 1676 5434 28042
2 01-03-2010 25491 1485 6318 29824
3 01-04-2010 26503 6290 17238 48911
4 01-05-2010 26654 6544 16224 45521
我們把文件中的訂閱人數根據日期的推進畫出來:
import pandas as pd from matplotlib import pyplot as plt subscriber=pd.read_csv(r"http://datasets.flowingdata.com/flowingdata_subscribers.csv") fig,ax=plt.subplots() time=[pd.to_datetime(i) for i in subscriber["Date"]] ax.plot(time,subscriber["Subscribers"],"o",color="blue") ax.set(xlabel="Date",ylabel="Number of subsribers") ax.set_title("Growth of subscribers --- Jan 2010") ax.annotate("2 days where \nit went wrong",xy=(0.43,0.06),xycoords=‘axes fraction‘, xytext=(0.56,0.1),textcoords=‘axes fraction‘, arrowprops=dict(facecolor=‘black‘, shrink=0.05)) ax.annotate("25047",xy=(0.046,0.8),xycoords=‘axes fraction‘, xytext=(0.004,0.68),textcoords=‘axes fraction‘, arrowprops=dict(arrowstyle="-")) ax.annotate("27611\n(+10%)",xy=(0.955,0.92),xycoords=‘axes fraction‘, xytext=(0.905,0.76),textcoords=‘axes fraction‘, arrowprops=dict(arrowstyle="-")) ax.spines["left"].set_visible(False) ax.spines["right"].set_visible(False) ax.spines["top"].set_visible(False) plt.show()
圖像如下:
可以看到有兩個點情況異常,由於原因未知,添加註釋進行說明。
接下來看看第二個數據文件的前5行:
state murder forcible_rape robbery aggravated_assault 0 United States 5.6 31.7 140.7 291.1 1 Alabama 8.2 34.3 141.4 247.8 2 Alaska 4.8 81.1 80.9 465.1 3 Arizona 7.5 33.8 144.4 327.4 4 Arkansas 6.7 42.9 91.1 386.8 burglary larceny_theft motor_vehicle_theft population 0 726.7 2286.3 416.7 295753151 1 953.8 2650.0 288.3 4545049 2 622.5 2599.1 391.0 669488 3 948.4 2965.2 924.4 5974834 4 1084.6 2711.2 262.1 2776221
這是美國各州各種犯罪行為的發生率(每10萬人口)。
讓我們看看各州謀殺率和入室盜竊率之間是否有關聯,同時把各州的人口也顯示出來,看看人口多的州是否這兩種犯罪率同時也高。
首先把第一行United States的平均數據去除,然後把population,state,murder,burglary這幾項數據分別揀出。在scatter命令中,以murder為x軸,burglary為y軸,s(氣泡面積)按population調整,alpha為透明度。其中有一個州的謀殺率特別高,因此把x軸的上下限調整一下,以便更好地看出謀殺率和入室盜竊率之間的關系。這樣,一個三維圖像就畫了出來。
import pandas as pd from matplotlib import pyplot as plt crime=pd.read_csv(r"http://datasets.flowingdata.com/crimeRatesByState2005.csv") fig,ax=plt.subplots(figsize=(10,5)) crime=crime[1:] population=crime["population"].values state=crime["state"].values murder=crime["murder"].values burglary=crime["burglary"].values ax.scatter(murder,burglary,s=population/40000,alpha=0.6) ax.set(xlim=(0,11),ylim=(200,1300), xlabel="Murder per 100,000 population", ylabel="Burglary per 100,000 population", title="Murder & Burglary in USA") for i,j,z in zip(murder,burglary,state): ax.text(x=i-0.3,y=j-0.1,s=z,fontsize=7) ax.spines["top"].set_visible(False) ax.spines["left"].set_visible(False) ax.spines["right"].set_visible(False) plt.show()
圖像如下:
可以看出謀殺率和入室盜竊率之間是呈正比關系的,但是人口多的州並非這兩種犯罪率就高。
此外,可以通過設置scatter命令中的c(顏色)參數,進而來展示四維圖像。
Matplotlib學習---用matplotlib畫散點圖,氣泡圖(scatterplot, bubble chart)