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)
df = pd.DataFrame(
    {"x": x,"y": y}
)
sns.lmplot(data=df, x = "x", y = "y", height=6, fit_reg=True)
f=np.poly1d(np.polyfix(df["x"],df["y"], 1))
reg=f(df["x"])
plt.plot(df["x"],reg, c="r", linewidth=0.1)
sns.set(font='IPAPMincho', font_scale=1.8)
plt.show()

seaborn_2

熱度表 HeatMap

當一大堆數值人類無法理解,但其大小卻有相互關連時,可以用顏色的深淺來表示,稱為熱度表。

import pandas as pd
import seaborn as sns
import pylab as plt
import numpy as np
ls=[]
for i in range(20):
    ls.append(np.random.random(20))
df=pd.DataFrame(data=ls)
sns.heatmap(df, fmt=".2f", annot=True, annot_kws={"size":6})
plt.show()

分類數據圖 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(data=df, x="no")
plt.show()

lotto649_1

todo

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *