我正在使用pandas和matplotlib生成大量柱状图。
我知道如何循环遍历选定颜色的列表,(如何为pandas/matplotlib柱状图自定义颜色)。问题是选择哪些颜色使得我的图表在纸上打印出来看起来漂亮(这是一篇研究论文)。我最感兴趣的是列之间有足够的对比度,并且选择的颜色看起来令人愉悦。我希望有多种颜色而不是灰度或单色调色板。
是否有任何预先确定的选项可供选择?
我正在使用pandas和matplotlib生成大量柱状图。
我知道如何循环遍历选定颜色的列表,(如何为pandas/matplotlib柱状图自定义颜色)。问题是选择哪些颜色使得我的图表在纸上打印出来看起来漂亮(这是一篇研究论文)。我最感兴趣的是列之间有足够的对比度,并且选择的颜色看起来令人愉悦。我希望有多种颜色而不是灰度或单色调色板。
是否有任何预先确定的选项可供选择?
所以您的要求是“有很多颜色”并且“打印时没有两种颜色应映射到相同的灰度值”,对吗?第二个标准应该由任何“顺序”颜色映射(在亮度上单调增加或减少)满足。我认为在matplotlib的所有选择中,您只剩下、和:
白色线条代表每种颜色的亮度,因此可以看出每种颜色在打印时会映射到不同的灰度值。黑色线条是色调,显示它们循环穿过各种颜色。
请注意,cubehelix实际上是一个函数(from matplotlib._cm import cubehelix
),您可以调整螺旋的参数以产生更广泛变化的颜色如此所示。换句话说,cubehelix不是一种颜色映射,而是一组颜色映射系列。这里有两个变化:
对于颜色变化较小的情况(对于许多事物来说更加愉悦,但可能不适用于您的条形图),可以尝试使用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'
。设计这些颜色映射的过程在SciPy 2015 | 为Matplotlib设计更好的默认颜色映射中有详细介绍。
用于此过程的工具可以通过pip install viscm
进行安装。
我建议使用cubehelix
颜色地图。它被设计成在彩色和灰度中都具有正确的亮度排序。
我不知道有预先制定的方案。我通常在发布图表时使用几种颜色。在选择颜色时,我主要考虑以下两点:
如果在matplotlib图中未指定颜色,则它有一个默认的颜色集合,并循环使用。 这个答案对如何更改默认颜色集合进行了很好的解释。你可以将其自定义为您喜欢的颜色集,因此图表会依次使用它们。