Seaborn海生圖

      在〈Seaborn海生圖〉中留言功能已關閉

在海量的資料中,畫出一張有用的圖,稱為海生圖。也就是在千萬筆資料量中,進行統計分析。

seabron(海生圖)是用於分類數據的繪圖. 常被import簡寫成 sns. sns所繪製的圖表, 是依附於matplotlib裏面的, 故於最後需使用plt.show()將圖表顯示出來. seaborn可說是matplotlib的加強版

安裝

pip install seaborn matplotlib numpy。

請特別注意一下,使用 matplotlib 3.5.2的版本會閃退,所以請退回前一個版本 3.5.1。

直方圖 histplot()

histogram[ˋhɪstə͵græm]  用來統計最常座落的地方,及異常的地方。是一種對數據分佈狀況的圖形表示。直方圖為二維統計圖表,兩個坐標分別是統計樣本和該樣本對應的某個屬性的度量。

下面代碼, 使用 numpy產生10000組標準常態分配亂數, 再用sns.displot 統計每個數值出現的次數, 然後依次數繪製直方圖. kde 為 kernel density estimate(核心密度評估)

請注意, set_style需寫為plt.subplot()之前

import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
sample=np.random.normal(size=10000)
print(sample)

sns.set_style('whitegrid')
plt.subplot(2,2,1)
sns.histplot(sample)

sns.set_style('ticks')
plt.subplot(2,2,2)
sns.histplot(sample, kde=False)

sns.set_style('darkgrid')
plt.subplot(2,2,3)
sns.histplot(sample)

plt.show()
#white, dark, whitegrid, darkgrid, ticks

seaborn5

回歸線圖 lmplot()

底下的程式,先在平面上繪製散落各地的點, fit_reg為設定是否顯示regression(迴歸線).

sns.set()為設定字型及尺寸, 多次設定的話, 以最後一次的設定值為主.

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
x=np.random.randint(1,1000, 100)
y=np.random.randint(1,1000, 100)
cars_df = pd.DataFrame(
    {"x": x,"y": y}
)
sns.lmplot(x = "x", y = "y", data = cars_df, height=6, fit_reg=True)
sns.set(font='IPAPMincho', font_scale=1.8)
plt.show()

seaborn_2

分類數據圖 catplot()

以大樂透649為例, 共有7個位置, 我們使用下面的代碼列出, 每個位置號碼出現的次數, 以下是由實際的歷史資料演算而得的

swarm

請注意 kind=’swarm’ (成群), 可讓點看起來較鬆散. 另外也可使用jitter=Faslse禁止抖動而成一條線. 但 jitter與kind不可同時混用

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
import mysql.connector as mysql
conn=mysql.connect(host="ip",user="account", password="password", database="資料庫")
cmd="select * from lotto649 order by lt_date"
cursor=conn.cursor()
cursor.execute(cmd)
rows=cursor.fetchall()
x=[]
y=[]
for row in rows:
    for i in range(0,7):
        x.append(i+1)
        y.append(row[3+i])
df = pd.DataFrame({"x": x,"y": y})
sns.set_style('whitegrid')
sns.catplot(data = df, x="x", y="y", kind='swarm')
plt.show()

seaborn_3

箱線圖

將kind改成box, 即可繪製箱線圖

sns.catplot(data = df, x="x", y="y",kind='box')

seaborn_4

Boxen

boxen可顯示更多的資訊, 如下

sns.catplot(data = df, x="x", y="y",kind='boxen')

seaborn_5

長條圖 bar

sns.catplot(data = df, x="x", y="y",kind='bar')

seaborn_6

線型圖 point

底下統計每個年齡層的死亡人數. 請注意 sns.factorplot()也是線型圖, 但factorplot即將被淘汱, 請不要再使用

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
age = range(0,100, 10)
pop = np.random.randint(100,200,10)
df = pd.DataFrame(
    {"age": age,
     "pop": pop
    }
)
sns.catplot(data = df, x="age", y="pop", kind="point")
plt.show()

seaborn_line

歷年來大樂透1~49每個號碼出現的次數

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
import mysql.connector as mysql
conn=mysql.connect(host="ip",user="account", password="pwd", database="database")
cmd="select * from lotto649 order by lt_date"
cursor=conn.cursor()
cursor.execute(cmd)
rows=cursor.fetchall()
ls=[]
for row in rows:
    for i in range(0,6):
        ls.append(row[3+i])
df=pd.DataFrame({"no":ls})
sns.set_style('whitegrid')
sns.countplot(x="no", data=df)
plt.show()

lotto649_1

todo