Pandas数据框图,颜色不唯一

htrmnn0y  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(117)

根据Pandasmanual,参数***Colormap***可以用于从matplotlib colormap对象中选择颜色,但是对于每个条形图,在条形图的情况下,需要手动选择颜色,这是没有能力的,如果你有很多条形图,手动的努力是烦人的,我的期望是,如果没有选择颜色,每个对象/类应该有一个唯一的颜色表示。2不幸的是,事实并非如此。3颜色是重复的。4只提供了10种唯一的颜色。
复制代码:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0,100,size=(100, 25)), columns=list('ABCDEFGHIJKLMNOPQRSTUVWXY'))
df.set_index('A', inplace=True)
df.plot(kind='bar', stacked=True, figsize=(20, 10))
plt.title("some_name")
plt.savefig("some_name" + '.png')

有人知道如何为图中的每个类设置唯一的颜色吗?

68bkxrlz

68bkxrlz1#

这可能是因为默认属性循环中的颜色(* 见下图 *)只有10个。
一种 * 变通方法 * 是设置一个随机颜色列表(在您的示例中为24),并将其作为 * kwarg * 传递给pandas.DataFrame.bar

import random

list_colors= ["#"+"".join([random.choice("0123456789ABCDEF") for j in range(6)])
              for i in range(len(df.columns))]

df.plot(kind="bar", stacked=True, figsize=(20, 10), color=list_colors)

    • 更新日期:**

可能很难找到一个包含24种不同颜色的调色板。但是,您可以使用海运中提供的调色板之一:

import seaborn as sns #pip install seaborn

list_colors = sns.color_palette("hsv", n_colors=24)

df.plot(kind="bar", stacked=True, figsize=(20, 10), color=list_colors)

另一个解决方案是使用scipy中的scipy.spatial.distance.euclidean

from scipy.spatial import distance #pip install scipy

def hex_to_rgb(hex_color):
    return tuple(int(hex_color[i:i+2], 16) for i in (1, 3, 5))

def distinct_colors(n):
    colors = []
    while len(colors) < n:
        color = "#" + "".join(random.choice("0123456789ABCDEF") for _ in range(6))
        if all(distance.euclidean(hex_to_rgb(color), hex_to_rgb(c)) > 50 for c in colors):
            colors.append(color)
    return colors

colors = distinct_colors(len(df.columns)) #len(df.columns)=24
sns.palplot(colors)

相关问题