美文网首页DATA ANALYSIS PROCESS
Matplotlib和Seaborn之多变量可视化

Matplotlib和Seaborn之多变量可视化

作者: IntoTheVoid | 来源:发表于2020-04-23 13:39 被阅读0次

    使用颜色表示第三个变量

    在 matplotlib 和 seaborn 中,向图形中添加第三个变量的最常见方式是使用颜色。你已经在这节课的集群条形图和热图中见过这种方式。violinplotboxplotbarplot 函数都可以通过添加“hue”参数显示第三个变量集群。可以调整热图的代码,以便描绘第三个变量(而不是计数),只需更改 hist2d 的“weights”参数,或者要馈送给 heatmap 的数据整合函数。

    对于散点图来说,可以通过两种不同的方式设置颜色,取决于变量类型。对于数字变量来说,你可以直接在 scatter 函数调用中设置“color”或“c”参数。

    plt.scatter(data = df, x = 'num_var1', y = 'num_var2', c = 'num_var3')
    plt.colorbar()
    
    
    image.png

    如果你有一个定性变量,可以通过 seaborn 的 FacetGrid 类上的“hue”参数为分类变量的不同级别设置不同的颜色。

    g = sb.FacetGrid(data = df, hue = 'cat_var1', size = 5)
    g.map(plt.scatter, 'num_var1', 'num_var2')
    g.add_legend()
    
    
    image.png

    调色板类型

    根据你的变量类型,你可能需要选择默认调色板之外的其他调色板。有三种主要调色板类型:定性、连续和发散调色板。

    定性调色板面向的是名目型数据。这是默认调色板采用的调色板类。在定性调色板中,连续性颜色值是有区别的,因此并没暗含任何固有的顺序。好的定性调色板的颜色应该尝试避免在亮度和饱和度方面出现剧烈变化,导致读者认为某个类别比其他类别更重要,除非要故意这么强调。

    sb.palplot(sb.color_palette(n_colors=9))
    
    

    (文档:seaborn palplot, color_palette

    image.png

    对于其他类型的数据(名目和数字),可能需要在连续尺度和发散尺度之间做出选择。在连续调色板中,连续的颜色值应该相互之间保持系统性。通常,在单个或小范围的色调之间保持从浅到深的顺序,其中浅色表示值较低,深色表示值很高。默认的连续色图“viridis”采用的是相反的表示法,深色表示较低的值,浅色表示很高的值。

    sb.palplot(sb.color_palette('viridis', 9))
    
    
    image.png

    大多数情况下,连续调色板可以很好地描绘有序或数字数据。但是,如果变量有一个有意义的零或中心值,你可能需要考虑使用发散调色板。在发散调色板中,将两个具有不同色调的连续调色板放在一起,并用一个共同的颜色(通常是白色或灰色)连接它们。一个色调表示大于中心点的值,另一个色调表示小于中心点的值。

    sb.palplot(sb.color_palette('vlag', 9))
    
    
    image.png

    设置调色板

    如果你想要(或需要)更改图形的色图,最简单的方式是使用 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)
    • 发散:’vlag' (blue-white-red)、’icefire' (blue-black-orange)

    对于所有这些字符串,在后面附加 '_r' 会颠倒调色板,如果序列或发散调色板的呈现方式与你预期的相反,这么设置很有用。

    设置调色板的方式取决于所使用的绘图函数。请参阅相关文档,了解具体详情。例如,在 FacetGrid 中可以通过“palette”参数设置调色板,在 scatter 中可以通过“cmap”参数设置。在使用发散调色板时,你可能需要指定“vmin”和“vmax”参数,以便调色板中的中性点与刻度的中心点为同一个点。此外,创建其他标准化函数的解决方案(例如在此 Stack Overflow 会话中发布的解决方案)可以用于精细地控制色图。发散颜色刻度对热图来说很常见,专门有一个“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([])
    
    
    image.png

    在两个变量之间进行分面

    之前在这节课,你了解了可以如何使用 FacetGrid 根据分类变量的不同级别对数据集分组,然后为每个子集创建一个图形。之前演示的分面图形是单变量图形,实际上你可以使用任何图形类型,并使用分面双变量图形创建多变量图形。

    借助 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 表示不再将每个分面标记为行和列变量的组合,而是将标签单独放在分面网格的顶部和右侧边缘。这种方式效果很棒,因为默认的图形标题通常很长。

    image.png

    相关文章

      网友评论

        本文标题:Matplotlib和Seaborn之多变量可视化

        本文链接:https://www.haomeiwen.com/subject/nmjnfqtx.html