定制Colorbars
绘图图例标识离散点的离散标签。对于基于点,线或区域颜色的连续标签,标记的颜色条可以是一个很好的工具。在Matplotlib中,颜色条是一个单独的轴,可以为绘图中的颜色含义提供关键。因为这本书是用黑白打印的,所以这一部分有一个随附的在线补充,你可以在其中查看全彩色的数字(https://github.com/jakevdp/PythonDataScienceHandbook)。我们首先设置笔记本以绘制和导入我们将使用的功能:
import matplotlib.pyplot as plt
plt.style.use('classic')
%matplotlib inline
import numpy as np
正如我们在本节中多次看到的那样,可以使用以下plt.colorbar
函数创建最简单的颜色条:
x = np.linspace(0, 10, 1000)
I = np.sin(x) * np.cos(x[:, np.newaxis])
plt.imshow(I)
plt.colorbar();
![db513b1ff99e1c0ab83028a186de8e68.png](https://i-blog.csdnimg.cn/blog_migrate/a1861e38ec69db7449ea21beb63bb5aa.png)
我们现在将讨论一些定制这些色块的想法,并在各种情况下有效地使用它们。
定制Colorbars
可以使用cmap
创建可视化的绘图功能的参数来指定色彩映射:
plt.imshow(I, cmap='gray');
![b68f783135fa5c4430e3b13b8ef526af.png](https://i-blog.csdnimg.cn/blog_migrate/c82c8da7a0c793df2ca4398da269fdc3.png)
所有可用的色彩映射都在plt.cm
命名空间中; 使用IPython的tab-completion将为您提供内置可能性的完整列表:
plt.cm.<TAB>
但是能够选择色彩图只是第一步:更重要的是如何决定可能性!选择结果比您最初预期的要简单得多。
选择颜色表
在可视化中对颜色选择的完整处理超出了本书的范围,但是为了阅读有关该主题和其他主题的阅读,请参阅文章“十个简单的更好的数字规则”。Matplotlib的在线文档也对色彩图选择进行了有趣的讨论。
从广义上讲,您应该了解三种不同类型的色彩映射:
- 连续色彩映射:这些色彩映射由一个连续的颜色序列组成(例如,
binary
或viridis
)。 - 不同的色彩映射:这些通常包含两种不同的颜色,显示与均值(例如,
RdBu
或PuOr
)的正偏差和负偏差。 - 定性色图:这些混合色没有特定的序列(例如,
rainbow
或jet
)。
该jet
颜色表,这是在之前版本2.0 Matplotlib默认值,是一个质的颜色表的一个例子。它的默认状态非常不幸,因为定性地图往往是表示定量数据的不良选择。问题之一是定性图通常在尺度增加时不显示任何均匀的亮度变化。
我们可以通过将jet
颜色条转换为黑白来看到这一点:
from matplotlib.colors import LinearSegmentedColormap
def grayscale_cmap(cmap):
"""Return a grayscale version of the given colormap"""
cmap = plt.cm.get_cmap(cmap)
colors = cmap(np.arange(cmap.N))
# convert RGBA to perceived grayscale luminance
# cf. http://alienryderflex.com/hsp.html
RGB_weight = [0.299, 0.587, 0.114]
luminance = np.sqrt(np.dot(colors[:, :3] ** 2, RGB_weight))
colors[:, :3] = luminance[:, np.newaxis]
return LinearSegmentedColormap.from_list(cmap.name + "_gray", colors, cmap.N)
def view_colormap(cmap):
"""Plot a colormap with its grayscale equivalent"""
cmap = plt.cm.get_cmap(cmap)
colors = cmap(np.arange(cmap.N))
cmap = grayscale_cmap(cmap)
grayscale = cmap(np.arange(cmap.N))
fig, ax = plt.subplots(2, figsize=(6, 2),
subplot_kw=dict(xticks=[], yticks=[]))
ax[0].imshow([colors], extent=[0, 10, 0, 1])
ax[1].imshow([grayscale], extent=[0, 10, 0, 1])
view_colormap('jet')
![6af769f7fceb8c259833dfa1f04a34e5.png](https://i-blog.csdnimg.cn/blog_migrate/b344d77b7a2b1c81c5d605e614991697.png)
请注意灰度图像中的明亮条纹。即使是全彩色,这种不均匀的亮度也意味着眼睛会被吸引到颜色范围的某些部分,这可能会强调数据集的不重要部分。最好使用viridis
色彩映射,例如(默认为Matplotlib 2.0),它专门构造为在整个范围内具有均匀的亮度变化。因此,它不仅可以很好地适应我们的色彩感知,而且可以很好地转换为灰度打印:
view_colormap ('viridis' )
![379e6ce49461c8547fcabcaf9b64d85d.png](https://i-blog.csdnimg.cn/blog_migrate/de30c12622090ea0fae5a678714e5f1b.png)
如果您喜欢彩虹方案,那么连续数据的另一个好选择是cubehelix
色彩映射:
view_colormap ('cubehelix' )
![154aa718f584c5d2f3c6d183d5cdef5e.png](https://i-blog.csdnimg.cn/blog_migrate/528b0170e5671e6098629abe29a62e03.png)
对于其他情况,例如显示某些均值的正偏差和负偏差,诸如RdBu
(红 - 蓝)的双色颜色条可能是有用的。但是,正如您在下图中看到的那样,重要的是要注意,在转换为灰度时,正负信息将会丢失!
view_colormap ('RdBu' )
![09109dfc940603823b9c61e8ce331a73.png](https://i-blog.csdnimg.cn/blog_migrate/3ec15358f49a24674d0a72cca84ea023.png)
我们将继续看到使用其中一些色彩映射的示例。
Matplotlib中有大量的色彩图; 要查看它们的列表,可以使用IPython来探索plt.cm
子模块。有关Python中更具原则性的颜色方法,您可以参考Seaborn库中的工具和文档(请参阅使用Seaborn进行可视化)。