为python中的集群图分配唯一的颜色

Posted

技术标签:

【中文标题】为python中的集群图分配唯一的颜色【英文标题】:assigning a unique color to the plot of clusters in python 【发布时间】:2021-02-07 03:40:53 【问题描述】:

我有一个分为 27 个集群的数据框。为了仅在一个图中绘制所有这些集群,我使用以下 for 循环:

list_of_clusters= list(set(klabels))
    
fig=plt.figure(figsize=(13,9),frameon=True,facecolor='lightgrey', edgecolor='black')
    ax = fig.add_subplot(1,1,1)
    plt.axis()
    plt.xlim([-2.5, 0.2])
    plt.ylim([-0.7, 3.3])
    plt.xlabel("log PhiZ")
    plt.ylabel("log RQI")
    
    for i in list_of_clusters:
        
        plt.scatter(
        logphizlogrqi[klabels == i, 0], logphizlogrqi[klabels == i, 1],
        s=10, cmap='hsv',
        marker='8',
        label=i+1
        )
    
    
    
    ax.yaxis.tick_right()
    ax.yaxis.set_ticks_position('both')
    plt.legend(scatterpoints=1, loc='center left',bbox_to_anchor=(-0.4, 0.5))
    plt.grid()
    plt.show()

但生成的图表不止一次使用每种颜色,如下图所示:

理想情况下,我正在寻找的图表应该如下所示(虽然颜色彼此接近,但它们只使用一次):

如果您能帮我解决我的问题,我将不胜感激

【问题讨论】:

您可以查看一些现有的colormaps,看看它们是否适用于您的情况。 @hilberts_drinking_problem 我有。所有这些都导致相同的情节。我尝试过定性、杂项、发散等,但没有一个奏效。 https://***.com/questions/8389636/creating-over-20-unique-legend-colors-using-matplotlib/44937195#44937195我觉得这个答案很有帮助 @r-beginners 不幸的是不起作用。我收到以下错误:(AttributeError:'AxesSubplot' 对象没有属性'set_color')。其他答案也无法正常工作 我通常使用 like this solution 和非重复的颜色图。但总的来说,27 种易于区分的独特颜色是雄心勃勃的。 【参考方案1】:

请在seaborn的示例中添加并修复以下代码以响应评论。

添加。

import seaborn as sns

NUM_COLORS = 27

sns.reset_orig() 
colors = sns.color_palette('husl', n_colors=NUM_COLORS)

编辑

for i in list_of_clusters:
    plt.scatter(
    logphizlogrqi[klabels == i, 0], logphizlogrqi[klabels == i, 1],
    s=10, cmap='hsv',
    marker='8',
    label=i+1,
    color=colors[i] # update
    )

【讨论】:

【参考方案2】:

所以我想出了这个方法并且效果很好:

from matplotlib import colors as mcolors
import random

list_of_clusters= list(set(klabels))

colors = list(mcolors.CSS4_COLORS.keys())
random.shuffle(colors)

fig=plt.figure(figsize=(13,9),frameon=True,facecolor='lightgrey', edgecolor='black')
ax = fig.add_subplot(1,1,1)
plt.axis()
plt.xlim([-2.5, 0.2])
plt.ylim([-0.7, 3.3])
plt.xlabel("log PhiZ")
plt.ylabel("log RQI")

for i in list_of_clusters:
    plt.scatter(
    logphizlogrqi[klabels == i, 0], logphizlogrqi[klabels == i, 1],
    s=10,
    marker='8',
    label=i+1,
    color=colors[i]
    )

ax.yaxis.tick_right()
ax.yaxis.set_label_position('right')
ax.yaxis.set_ticks_position('right')
plt.legend(scatterpoints=1, loc='center left',bbox_to_anchor=(-0.4, 0.5))
plt.show()

结果如下所示:

【讨论】:

以上是关于为python中的集群图分配唯一的颜色的主要内容,如果未能解决你的问题,请参考以下文章

散点图通过颜色matplotlib python分离集群

为 R 中的 facet_wrap 直方图的每个图分配自定义颜色 - ggplot

Python中的颜色处理

有没有更好的方法来为 Python 中的集群分配数组生成成员矩阵(单热数组)? [复制]

如何从 Python 中的 scipy 中的链接/距离矩阵计算集群分配?

使用与地面实况定义相同的颜色为集群着色以进行可视化