我正在使用 pandas 和 matplotlib 生成带有很多条形的条形图。
我知道如何循环浏览选定颜色的列表(如何给 pandas/matplotlib 条形图自定义颜色)。问题是要选择什么颜色,以便我的图表可以很好地打印在纸上(用于研究论文)。我最感兴趣的是列之间的足够对比和看起来令人愉快的颜色选择。我想要多种颜色而不是灰度或单色调配色方案。
是否有任何预定的方案可供人们使用?
我正在使用 pandas 和 matplotlib 生成带有很多条形的条形图。
我知道如何循环浏览选定颜色的列表(如何给 pandas/matplotlib 条形图自定义颜色)。问题是要选择什么颜色,以便我的图表可以很好地打印在纸上(用于研究论文)。我最感兴趣的是列之间的足够对比和看起来令人愉快的颜色选择。我想要多种颜色而不是灰度或单色调配色方案。
是否有任何预定的方案可供人们使用?
所以你的要求是“很多颜色”和“打印时没有两种颜色应该映射到相同的灰度值”,对吗?任何“顺序”颜色图(亮度单调增加或减少)都应满足第二个标准。我认为在 matplotlib 中的所有选择中,您只剩下cubehelix
(已经提到过)gnuplot
、、和gnuplot2
:
白线是每种颜色的亮度,因此您可以看到每种颜色在打印时会映射到不同的灰度值。黑线是色调,表明它们在各种颜色中循环。
请注意,cubehelix 实际上是一个函数 ( from matplotlib._cm import cubehelix
),您可以调整 helix 的参数以产生更多变化的颜色,如下所示。换句话说,cubehelix 不是颜色图,它是一组颜色图。这里有 2 个变体:
对于变化较少的颜色(对许多事情来说更令人愉悦,但可能不适用于您的条形图),也许可以尝试 ColorBrewer 3 色地图,YlOrRd
, PuBuGn
, YlGnBu
:
https://www.flickr.com/photos/omegatron/7298887952/
不过,我不建议只使用这种颜色来识别条形图。您应该始终使用文本标签作为主要标识符。另请注意,其中一些会产生与背景完全融合的白条,因为它们用于热图,而不是图表颜色:
from matplotlib import pyplot as plt
import pandas, numpy as np # I find np.random.randint to be better
# Make the data
x = [{i:np.random.randint(1,5)} for i in range(10)]
df = pandas.DataFrame(x)
# Make a list by cycling through the colors you care about
# to match the length of your data.
cmap = plt.get_cmap('cubehelix')
indices = np.linspace(0, cmap.N, len(x))
my_colors = [cmap(int(i)) for i in indices]
# Specify this list of colors as the `color` option to `plot`.
df.plot(kind='bar', stacked=True, color=my_colors)
这些是新人:
在 1.5 中,matplotlib 将附带 4 个新的合理设计的颜色图:
'viridis'
(从 2.0 开始的默认颜色图)'magma'
'plasma'
'inferno'
.A Better Default Colormap for Matplotlib |中介绍了设计这些颜色图的过程。科学 2015 年。
为这个过程开发的工具可以通过pip install viscm
.
我会建议cubehelix
彩色地图。它被设计为在颜色和灰度中具有正确的亮度排序。
我不知道预定的计划。我通常使用几种颜色来绘制发布图。在选择颜色时,我主要考虑两点:
如果在 matplotlib 图中未指定颜色,则它有一组默认的颜色循环。这个答案很好地解释了如何更改默认颜色集。您可以将其自定义为您喜欢的颜色集,因此绘图将依次使用它们。