【问题标题】:How to set unique color for individual value of legend如何为图例的单个值设置唯一颜色
【发布时间】:2020-01-21 11:50:37
【问题描述】:

我的堆积条形图中有很多图例,我注意到在图例中颜色重复,所以我很难根据图例区分图中的真实值,所以我想为每个图例设置唯一的颜色传说中的价值,为此,我做了很多研究,有些没有用,有些很难理解,例如this 当我使用这个时,我得到了一个错误,'AxesSubplot' object has no attribute 'set_color_cycle' 所以有没有简单有效的方法

我不想要为每个元素单独应用颜色的代码,因为我的数据集很大,这里我的代码是关于我的情节的更多详细信息

例如

#suppose I have data of few cites and their complaints 
city = ['NEW YORK', 'ASTORIA', 'BRONX', 'BRONX', 'ELMHURST', 'BROOKLYN',
       'NEW YORK', 'BRONX', 'KEW GARDENS', 'BROOKLYN']
complaints = ['Noise - Street/Sidewalk', 'Blocked Driveway', 'Blocked Driveway',
       'Illegal Parking', 'Illegal Parking', 'Illegal Parking',
       'Illegal Parking', 'Blocked Driveway', 'Illegal Parking',
       'Blocked Driveway']
# and from this I have created a stack bar chart
cmpltnt_rela = test2.groupby(['City', 'Complaint Type']).size().unstack().fillna(0).plot(kind='bar', legend = True, stacked=True)
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5),ncol=2)
cmpltnt_rela.plot(figsize=(18,14))

它的结果看起来像这样,你可以注意到图例的元素颜色

【问题讨论】:

  • 你的标题是问如何将图例放在图表之外,但你的问题似乎是如何使颜色可区分,你能更清楚一点吗?
  • @Nathan 很抱歉我忘记编辑标题了,我已经编辑好了
  • 您能否添加一个示例 df 以便更轻松地重现您的问题?
  • 您链接到的答案解释了您在最后一段中出现此错误的原因。该线程中还有其他答案。
  • @ImportanceOfBeingErnest 是的,我知道,但它们适用于子图,他们通过迭代(单独)应用它如何为我的代码转换我不知道你是否可以为我修改它那么这对我来说很棒

标签: python python-3.x pandas matplotlib


【解决方案1】:

您可以创建一个长度与唯一投诉数量相同的颜色列表。例如gist_ncar。在代码中,我打乱了颜色的顺序,以降低相似颜色接近的可能性。

请注意,很难拥有超过 20 种视觉上足够不同的颜色。不同的人和不同的显示器可能会导致颜色难以区分。

Thisthis 帖子提供了更多选择足够颜色的想法。在您的情况下,用相似的色调为相似的投诉着色可能会很有趣。

由于您的示例代码没有提供足够的数据,下面的代码会生成一些随机数。

import pandas as pd
from matplotlib import pyplot as plt
import random
import matplotlib as mpl

city = ['Londen', 'Paris', 'Rome', 'Brussels', 'Cologne', 'Madrid',
        'Athens', 'Geneva', 'Oslo', 'Barcelona', 'Berlin']
complaints = list('abcdefghijklmnopqrstuv')

N = 100
city_column = random.choices(city, k=N)
complaints_column = random.choices(complaints, k=N)
test2 = pd.DataFrame({'City': city_column, 'Complaint Type': complaints_column})

# take a colormap with many different colors and sample it at regular intervals
cmap = plt.cm.gist_rainbow
norm = mpl.colors.Normalize(vmin=0, vmax=len(complaints) - 1)
colors = [cmap(norm(i)) for i in range(len(complaints))]

# create a stack bar chart
cmpltnt_rela = test2.groupby(['City', 'Complaint Type']).size().unstack().fillna(0).plot(kind='bar',
      legend=True, stacked=True, color=colors)
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), ncol=2)
cmpltnt_rela.plot(figsize=(18, 14))
plt.tick_params('x', labelrotation=30)

plt.tight_layout()
plt.show()

【讨论】:

  • 有一个问题我有53列,同色的深浅差别不大,不能有效区分有没有其他办法
  • 在你问题的示例数据中,只有5组。我花时间创建了一个类似于示例图像的示例。您的问题没有提到 53 列。也许堆积条形图不是可视化数据的最适当方式?
  • 要走的路,就是将类似的投诉归为一组,从而大大减少组的数量。在每个组内,您可以使用相同颜色的不同色调来区分它们。
  • 非常感谢您的帮助。实际上我有一个问题要找出投诉与位置之间是否有任何关系,所以我认为找到这个堆栈条形图是一个好方法,因为我们可以查看任何投诉是否仅来自一个或几个城市,如果这种情况意味着是的,存在关系,反之亦然,所以我可以采用另一种方式
  • 通常情况下,不同的城市使用不同的标准来定义和描述他们的投诉。即使是同一个城市的不同警察局也会以不同的方式命名同一个投诉。
猜你喜欢
  • 1970-01-01
  • 2017-09-03
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-18
相关资源
最近更新 更多