使用顏色表示第三個變量
在 matplotlib 和 seaborn 中貌嫡,向圖形中添加第三個變量的最常見方式是使用顏色岛抄。你已經在這節(jié)課的集群條形圖和熱圖中見過這種方式。violinplot
弦撩、boxplot
和 barplot
函數都可以通過添加“hue”參數顯示第三個變量集群益楼。可以調整熱圖的代碼感凤,以便描繪第三個變量(而不是計數)陪竿,只需更改 hist2d
的“weights”參數屠橄,或者要饋送給 heatmap
的數據整合函數闰挡。
對于散點圖來說,可以通過兩種不同的方式設置顏色溪北,取決于變量類型夺脾。對于數字變量來說,你可以直接在 scatter
函數調用中設置“color”或“c”參數蚀乔。
plt.scatter(data = df, x = 'num_var1', y = 'num_var2', c = 'num_var3')
plt.colorbar()
如果你有一個定性變量菲茬,可以通過 seaborn 的 FacetGrid 類上的“hue”參數為分類變量的不同級別設置不同的顏色婉弹。
g = sb.FacetGrid(data = df, hue = 'cat_var1', size = 5)
g.map(plt.scatter, 'num_var1', 'num_var2')
g.add_legend()
調色板類型
根據你的變量類型,你可能需要選擇默認調色板之外的其他調色板。有三種主要調色板類型:定性佩脊、連續(xù)和發(fā)散調色板垫卤。
定性調色板面向的是名目型數據。這是默認調色板采用的調色板類歇盼。在定性調色板中评抚,連續(xù)性顏色值是有區(qū)別的,因此并沒暗含任何固有的順序邢笙。好的定性調色板的顏色應該嘗試避免在亮度和飽和度方面出現劇烈變化侍匙,導致讀者認為某個類別比其他類別更重要,除非要故意這么強調妇汗。
sb.palplot(sb.color_palette(n_colors=9))
(文檔:seaborn palplot
, color_palette
)
對于其他類型的數據(名目和數字),可能需要在連續(xù)尺度和發(fā)散尺度之間做出選擇寞焙。在連續(xù)調色板中告唆,連續(xù)的顏色值應該相互之間保持系統(tǒng)性。通常模她,在單個或小范圍的色調之間保持從淺到深的順序懂牧,其中淺色表示值較低,深色表示值很高畜侦。默認的連續(xù)色圖“viridis”采用的是相反的表示法躯保,深色表示較低的值,淺色表示很高的值验懊。
sb.palplot(sb.color_palette('viridis', 9))
大多數情況下尸变,連續(xù)調色板可以很好地描繪有序或數字數據召烂。但是,如果變量有一個有意義的零或中心值奏夫,你可能需要考慮使用發(fā)散調色板酗昼。在發(fā)散調色板中,將兩個具有不同色調的連續(xù)調色板放在一起仔雷,并用一個共同的顏色(通常是白色或灰色)連接它們。一個色調表示大于中心點的值电抚,另一個色調表示小于中心點的值。
sb.palplot(sb.color_palette('vlag', 9))
設置調色板
如果你想要(或需要)更改圖形的色圖俺祠,最簡單的方式是使用 matplotlib 或 seaborn 中的某個內置函數蜘渣。matplotlib 文檔的此部分具有一個可以當做顏色映射的字符串列表肺然。對于大部分情況,請使用 matplotlib 的內置調色板(’viridis' 等)或來自 ColorBrewer 的調色板拾碌;剩余的調色板看起來可能不夠一致街望。Seaborn 還增加了以下多個調色板:
- 定性(全部多達 6 種顏色):'deep’、’pastel’防症、’dark’哎甲、’muted’、’bright’、’colorblind'
- 有序:’rocket' (white-orange-red-purple-black)喝噪、’mako' (mint-green-blue-purple-black)
- 發(fā)散:’vlag' (blue-white-red)酝惧、’icefire' (blue-black-orange)
對于所有這些字符串,在后面附加 '_r' 會顛倒調色板巫财,如果序列或發(fā)散調色板的呈現方式與你預期的相反哩陕,這么設置很有用赫舒。
設置調色板的方式取決于所使用的繪圖函數闽瓢。請參閱相關文檔,了解具體詳情缺猛。例如椭符,在 FacetGrid 中可以通過“palette”參數設置調色板,在 scatter
中可以通過“cmap”參數設置有咨。在使用發(fā)散調色板時曙搬,你可能需要指定“vmin”和“vmax”參數纵装,以便調色板中的中性點與刻度的中心點為同一個點。此外橡娄,創(chuàng)建其他標準化函數的解決方案(例如在此 Stack Overflow 會話中發(fā)布的解決方案)可以用于精細地控制色圖挽唉。發(fā)散顏色刻度對熱圖來說很常見,專門有一個“center”參數用于設置中心值瓶籽。
最后塑顺,請注意透明度和重疊對圖形可解釋性的影響。如果定性刻度上具有不同顏色的點重疊了扬绪,可能會形成無法與調色板中的顏色匹配的第三種顏色裤唠。如果定性刻度上有多個點重疊了,那么可能會形成一個實際上不存在于數據中的值墓赴。為了保險起見,避免或盡量不使用透明度竣蹦。你可能需要僅繪制示例數據點痘括,確保第三個變量的效果很明顯。
plt.figure(figsize = [5,5])
# left: qualitative points
plt.scatter(0,0.5,s = 1e4, c = sb.color_palette()[0], alpha = 0.5)
plt.scatter(0,-0.5,s = 1e4, c = sb.color_palette()[1], alpha = 0.5)
# right: quantitative points
plt.scatter(1,0.5,s = 1e4, c = sb.color_palette('Blues')[2], alpha = 0.5)
plt.scatter(1,-0.5,s = 1e4, c = sb.color_palette('Blues')[4], alpha = 0.5)
# set axes for point overlap
plt.xlim(-0.5,1.5)
plt.ylim(-3.5,3.5)
plt.xticks([])
plt.yticks([])
在兩個變量之間進行分面
之前在這節(jié)課挠日,你了解了可以如何使用 FacetGrid 根據分類變量的不同級別對數據集分組嚣潜,然后為每個子集創(chuàng)建一個圖形椅贱。之前演示的分面圖形是單變量圖形,實際上你可以使用任何圖形類型计技,并使用分面雙變量圖形創(chuàng)建多變量圖形山橄。
借助 FacetGrid,不僅可以根據列對變量進行分面睡雇,還可以根據行分面饮醇。我們可以在兩個分面坐標軸的每個軸上設置分類變量,這是描繪多變量趨勢的另外一種方法观蓄。
g = sb.FacetGrid(data = df, col = 'cat_var2', row = 'cat_var1', size = 2.5,
margin_titles = True)
g.map(plt.scatter, 'num_var1', 'num_var2')
設置 margin_titles = True
表示不再將每個分面標記為行和列變量的組合呵晚,而是將標簽單獨放在分面網格的頂部和右側邊緣沫屡。這種方式效果很棒沮脖,因為默認的圖形標題通常很長芯急。