【问题标题】:Seaborn: create stacked histogram from list of tuplesSeaborn:从元组列表创建堆叠直方图
【发布时间】:2021-04-06 03:59:14
【问题描述】:

我有一个如下所示的元组列表:

[(7, 7, 57, 192), (7, 7, 57, 192), (7, 7, 57, 192), (7, 7, 57, 192), (7, 7, 52, 192), (7, 7, 52, 192)]

我想为元组中的所有值创建堆叠直方图。对于这种情况,将有 4 种颜色的直方图条(对应于元组中的每个位置),x 轴将是该特定索引中每个数字的出现频率。例如,

颜色

  • 红色 (0)
  • 蓝色 (1)
  • 绿色 (2)
  • 紫色 (3)

对于给定的颜色:

  • x 轴值为 7 处应该有一个长度为 6 的红色条
  • 在 x 轴值为 7 处会有一个长度为 6 的蓝色条(堆叠在红色上)
  • 在 x 轴值为 57 处会有一个长度为 4 的绿色条
  • 在 x 轴值为 52 处会有一个长度为 2 的绿色条
  • 在 x 轴值为 192 处会有一个长度为 6 的绿色条

如何使用 seaborn 做到这一点,而不必为 4 个元组位置创建单独的列表或不创建 pandas 数据框?

【问题讨论】:

    标签: python matplotlib seaborn histogram


    【解决方案1】:

    您可以创建从最后一种颜色循环到第一种颜色的直方图:

    import matplotlib.pyplot as plt
    import numpy as np
    import seaborn as sns
    
    data = [(7, 7, 57, 192), (7, 7, 57, 192), (7, 7, 57, 192), (7, 7, 57, 192), (7, 7, 52, 192), (7, 7, 52, 192)]
    sns.set()
    for i, color in enumerate(['red', 'blue', 'green', 'purple'][::-1]):
        sns.histplot([di for d in data for di in d[:4-i]], bins=np.arange(-0.5, 200), color=color)
    plt.show()
    

    PS:为了使代码更独立于元组的长度,可以从颜色图中检索颜色:

    n = len(data[0])
    colors = plt.cm.rainbow(np.linspace(0, 1, n))
    for i, color in enumerate(colors):
        sns.histplot([di for d in data for di in d[:n - i]], bins=np.arange(-0.5, 200), color=color)
    

    【讨论】:

    • 是的。有没有办法让颜色分配也随机?这个想法是不必对颜色进行硬编码。