簡體   English   中英

Python通過不同的數據框列進行繪圖(使用Seaborn?)

[英]Python plotting by different dataframe columns (using Seaborn?)

我正在嘗試根據不同的分類列使用點着色創建數據集的散點圖。 Seaborn在這里適合一個情節:

fg = sns.FacetGrid(data=plot_data, hue='col_1')
fg.map(plt.scatter, 'x_data', 'y_data', **kws).add_legend()
plt.show()

然后,我想顯示相同的數據,但使用hue ='col_2'和hue ='col_3'。 如果我僅繪制3個圖,效果很好,但我真的希望找到一種方法,使它們全部顯示為一個圖形。 不幸的是,我還沒有找到將色調從一種改變為另一種的方法。 我知道有些繪圖API允許使用axis關鍵字,因此可以將其彈出到matplotlib圖形中,但是我還沒有找到可以同時設置'ax ='和'hue ='的圖形API。 有任何想法嗎? 提前致謝!

編輯:這是一些示例代碼來說明這個想法

xx = np.random.rand(10,2)
cat1 = np.array(['cat','dog','dog','dog','cat','hamster','cat','cat','hamster','dog'])
cat2 = np.array(['blond','brown','brown','black','black','blond','blond','blond','brown','blond'])
d = {'x':xx[:,0], 'y':xx[:,1], 'pet':cat1, 'hair':cat2}
df = pd.DataFrame(data=d)

sns.set(style='ticks')
fg = sns.FacetGrid(data=df, hue='pet', size=5)
fg.map(plt.scatter, 'x', 'y').add_legend()
fg = sns.FacetGrid(data=df, hue='hair', size=5)
fg.map(plt.scatter, 'x', 'y').add_legend()
plt.show()

這在兩個窗口中繪制了我想要的圖。 配色方案在第一個圖中通過“ pet”分組進行設置,在第二個圖中通過“ hair”進行設置。 有什么辦法可以在一個情節上做到這一點嗎?

為了繪制3個散點圖,每個散點圖具有不同的顏色,您可以在matplotlib中創建3個軸,並將散點圖繪制到每個軸上。

import pandas as pd
import numpy as np; np.random.seed(42)
import matplotlib.pyplot as plt

df = pd.DataFrame(np.random.rand(10,5), 
                  columns=["x", "y", "col1", "col2", "col3"])

fig, axes = plt.subplots(nrows=3)
for ax, col in zip(axes, df.columns[2:]):
    ax.scatter(df.x, df.y, c=df[col])

plt.show()

在此處輸入圖片說明

對於分類數據,通常更容易繪制多個散點圖,每個類別一個。

import pandas as pd
import numpy as np; np.random.seed(42)
import matplotlib.pyplot as plt
import seaborn as sns


xx = np.random.rand(10,2)
cat1 = np.array(['cat','dog','dog','dog','cat','hamster','cat','cat','hamster','dog'])
cat2 = np.array(['blond','brown','brown','black','black','blond','blond','blond','brown','blond'])
d = {'x':xx[:,0], 'y':xx[:,1], 'pet':cat1, 'hair':cat2}
df = pd.DataFrame(data=d)


cols = ['pet',"hair"]
fig, axes = plt.subplots(nrows=len(cols ))
for ax,col in zip(axes,cols):
    for n, group in df.groupby(col):
        ax.scatter(group.x,group.y, label=n)
    ax.legend()

plt.show()

在此處輸入圖片說明

如果確實需要,可以肯定使用FacetGrid,但這需要DataFrame的其他數據格式。

import pandas as pd
import numpy as np; np.random.seed(42)
import matplotlib.pyplot as plt
import seaborn as sns

xx = np.random.rand(10,2)
cat1 = np.array(['cat','dog','dog','dog','cat','hamster','cat','cat','hamster','dog'])
cat2 = np.array(['blond','brown','brown','black','black','blond','blond','blond','brown','blond'])
d = {'x':xx[:,0], 'y':xx[:,1], 'pet':cat1, 'hair':cat2}
df = pd.DataFrame(data=d)

df2 = pd.melt(df, id_vars=['x','y'], value_name='category', var_name="kind")

fg = sns.FacetGrid(data=df2, row="kind",hue='category', size=3)
fg.map(plt.scatter, 'x', 'y').add_legend()

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM