1. 程式人生 > >Matplotlib學習---用matplotlib畫散點圖,氣泡圖(scatterplot, bubble chart)

Matplotlib學習---用matplotlib畫散點圖,氣泡圖(scatterplot, bubble chart)

1.4 shrink 關系 ots 讀取csv文件 指南 read -- 我們

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)