Matplotlib 颜色列表:全面掌握图表配色技巧
Matplotlib 是 Python 中最流行的数据可视化库之一,它提供了丰富的颜色选项,让用户能够创建出美观、专业的图表。本文将深入探讨 Matplotlib 中的颜色列表,帮助您全面掌握图表配色技巧,提升数据可视化效果。
1. Matplotlib 颜色基础
在开始使用 Matplotlib 的颜色列表之前,我们需要了解一些基本概念。Matplotlib 支持多种颜色表示方式,包括:
- 颜色名称字符串
- RGB 元组
- RGBA 元组
- 十六进制颜色代码
让我们通过一个简单的示例来了解这些表示方式:
import matplotlib.pyplot as plt
# 创建一个简单的折线图
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.figure(figsize=(10, 6))
# 使用颜色名称字符串
plt.plot(x, y, color='red', label='Red Line')
# 使用 RGB 元组
plt.plot(x, [i+1 for i in y], color=(0, 0.5, 0), label='Green Line')
# 使用 RGBA 元组
plt.plot(x, [i+2 for i in y], color=(0, 0, 1, 0.5), label='Blue Line (50% opacity)')
# 使用十六进制颜色代码
plt.plot(x, [i+3 for i in y], color='#FFA500', label='Orange Line')
plt.title('How to use different color formats in Matplotlib - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.grid(True)
plt.show()
Output:
在这个示例中,我们创建了四条不同颜色的线,分别使用了颜色名称字符串、RGB 元组、RGBA 元组和十六进制颜色代码。这个例子展示了 Matplotlib 支持的不同颜色表示方式的灵活性。
2. Matplotlib 内置颜色名称
Matplotlib 提供了一系列预定义的颜色名称,这些名称可以直接在绘图函数中使用。以下是一个展示常用内置颜色的示例:
import matplotlib.pyplot as plt
colors = ['red', 'green', 'blue', 'cyan', 'magenta', 'yellow', 'black', 'white',
'orange', 'purple', 'brown', 'pink', 'gray', 'olive', 'navy']
plt.figure(figsize=(12, 8))
for i, color in enumerate(colors):
plt.bar(i, 1, color=color, label=color)
plt.title('Matplotlib Built-in Color Names - how2matplotlib.com')
plt.xlabel('Color Index')
plt.ylabel('Value')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()
plt.show()
Output:
这个示例创建了一个条形图,展示了 Matplotlib 中常用的内置颜色名称。每个条形代表一种颜色,并使用相应的颜色名称作为标签。
3. 使用 RGB 和 RGBA 值
除了使用预定义的颜色名称,我们还可以使用 RGB(红绿蓝)或 RGBA(红绿蓝透明度)值来精确控制颜色。RGB 值的范围是 0 到 1,RGBA 中的 A(透明度)也是 0 到 1,其中 0 表示完全透明,1 表示完全不透明。
让我们看一个使用 RGB 和 RGBA 值的示例:
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
plt.figure(figsize=(10, 6))
# 使用 RGB 值
plt.plot(x, y1, color=(0.8, 0.2, 0.1), label='Sin curve (RGB)')
# 使用 RGBA 值
plt.plot(x, y2, color=(0.1, 0.2, 0.8, 0.5), label='Cos curve (RGBA)')
plt.title('RGB and RGBA Color Examples - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.grid(True)
plt.show()
Output:
在这个示例中,我们绘制了两条曲线:一条使用 RGB 值 (0.8, 0.2, 0.1) 表示的红色正弦曲线,另一条使用 RGBA 值 (0.1, 0.2, 0.8, 0.5) 表示的半透明蓝色余弦曲线。
4. 十六进制颜色代码
十六进制颜色代码是另一种常用的颜色表示方法。它使用 6 位十六进制数字来表示颜色,其中前两位表示红色,中间两位表示绿色,最后两位表示蓝色。
以下是一个使用十六进制颜色代码的示例:
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
categories = ['A', 'B', 'C', 'D', 'E']
values = [23, 45, 56, 78, 32]
plt.figure(figsize=(10, 6))
# 使用十六进制颜色代码
colors = ['#FF5733', '#33FF57', '#3357FF', '#FF33F1', '#33FFF1']
plt.bar(categories, values, color=colors)
plt.title('Bar Chart with Hex Color Codes - how2matplotlib.com')
plt.xlabel('Categories')
plt.ylabel('Values')
for i, v in enumerate(values):
plt.text(i, v + 1, str(v), ha='center')
plt.show()
Output:
这个示例创建了一个条形图,每个条形使用不同的十六进制颜色代码。这种方法允许我们精确控制每个条形的颜色。
5. 颜色映射(Colormaps)
颜色映射是 Matplotlib 中一个强大的功能,它允许我们将数值范围映射到颜色范围。Matplotlib 提供了多种预定义的颜色映射,如 ‘viridis’、’plasma’、’inferno’ 等。
让我们看一个使用颜色映射的示例:
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.linspace(0, 10, 100)
y = np.linspace(0, 10, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)
plt.figure(figsize=(12, 8))
# 使用 'viridis' 颜色映射
plt.contourf(X, Y, Z, cmap='viridis')
plt.colorbar(label='Z values')
plt.title('Contour Plot with Viridis Colormap - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
这个示例创建了一个等高线填充图,使用 ‘viridis’ 颜色映射来表示 Z 值的变化。颜色映射可以有效地展示数据的连续变化。
6. 自定义颜色循环
在绘制多条线或多个数据系列时,我们可能希望使用自定义的颜色循环。Matplotlib 允许我们定义自己的颜色循环,以满足特定的可视化需求。
以下是一个使用自定义颜色循环的示例:
import matplotlib.pyplot as plt
import numpy as np
# 定义自定义颜色循环
custom_colors = ['#FF9999', '#66B2FF', '#99FF99', '#FFCC99', '#FF99CC']
plt.rcParams['axes.prop_cycle'] = plt.cycler(color=custom_colors)
# 生成数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
y4 = x**2
y5 = x**3
plt.figure(figsize=(12, 8))
# 绘制多条曲线
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
plt.plot(x, y3, label='tan(x)')
plt.plot(x, y4, label='x^2')
plt.plot(x, y5, label='x^3')
plt.title('Custom Color Cycle Example - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.grid(True)
plt.show()
Output:
在这个示例中,我们定义了一个自定义的颜色循环,并使用 plt.rcParams['axes.prop_cycle']
来应用它。这样,每条新的曲线都会自动使用循环中的下一个颜色。
7. 颜色透明度
颜色透明度是一个重要的视觉效果,特别是在绘制重叠的图形时。我们可以通过 RGBA 值或 alpha
参数来控制透明度。
让我们看一个使用透明度的示例:
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
plt.figure(figsize=(10, 6))
# 使用不同的透明度
plt.fill_between(x, y1, alpha=0.3, color='red', label='Sin area')
plt.fill_between(x, y2, alpha=0.3, color='blue', label='Cos area')
plt.plot(x, y1, color='red', label='Sin curve')
plt.plot(x, y2, color='blue', label='Cos curve')
plt.title('Transparency Example - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.grid(True)
plt.show()
Output:
这个示例展示了如何使用透明度来填充曲线下的区域。通过设置 alpha=0.3
,我们创建了半透明的填充效果,使得重叠区域的颜色混合更加自然。
8. 颜色渐变
颜色渐变可以用来表示数据的连续变化或创建吸引人的视觉效果。Matplotlib 提供了多种方法来创建颜色渐变。
以下是一个使用颜色渐变的示例:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
# 创建自定义颜色渐变
colors = ['#FF0000', '#FFFF00', '#00FF00'] # 红色到黄色到绿色
n_bins = 100 # 颜色的数量
cmap = LinearSegmentedColormap.from_list('custom_cmap', colors, N=n_bins)
# 生成数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.figure(figsize=(12, 6))
# 使用颜色渐变绘制散点图
scatter = plt.scatter(x, y, c=y, cmap=cmap, s=50)
plt.colorbar(scatter, label='Sin(x) value')
plt.title('Color Gradient Example - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
在这个示例中,我们创建了一个自定义的颜色渐变,从红色过渡到黄色再到绿色。然后,我们使用这个渐变来绘制散点图,其中点的颜色根据 y 值(即 sin(x) 的值)变化。
9. 离散颜色映射
有时我们需要使用离散的颜色来表示不同的类别或分组。Matplotlib 提供了多种方法来创建和使用离散颜色映射。
让我们看一个使用离散颜色映射的示例:
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
categories = ['A', 'B', 'C', 'D', 'E']
values = [23, 45, 56, 78, 32]
# 创建离散颜色映射
colors = plt.cm.Set3(np.linspace(0, 1, len(categories)))
plt.figure(figsize=(10, 6))
# 使用离散颜色映射绘制条形图
bars = plt.bar(categories, values, color=colors)
plt.title('Discrete Color Mapping Example - how2matplotlib.com')
plt.xlabel('Categories')
plt.ylabel('Values')
# 添加数值标签
for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2., height,
f'{height}', ha='center', va='bottom')
plt.show()
Output:
这个示例使用了 Matplotlib 的 Set3
颜色映射来为不同的类别分配不同的颜色。这种方法特别适合于表示离散的类别数据。
10. 颜色标准化
在处理大范围的数值数据时,我们可能需要对颜色进行标准化,以便更好地展示数据的分布。Matplotlib 提供了多种标准化方法,如线性标准化、对数标准化等。
以下是一个使用颜色标准化的示例:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LogNorm# 生成数据
x = np.random.randn(1000)
y = np.random.randn(1000)
z = np.random.rand(1000) * 10000 # 使用大范围的值
plt.figure(figsize=(12, 6))
# 使用对数标准化
scatter = plt.scatter(x, y, c=z, cmap='viridis', norm=LogNorm())
plt.colorbar(scatter, label='Z values (log scale)')
plt.title('Color Normalization Example - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
在这个示例中,我们使用 LogNorm()
对 z 值进行对数标准化。这样可以更好地展示大范围数据的分布,使得小值和大值之间的差异更加明显。
11. 自定义颜色映射
虽然 Matplotlib 提供了许多内置的颜色映射,但有时我们可能需要创建自定义的颜色映射以满足特定的可视化需求。以下是一个创建自定义颜色映射的示例:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
# 定义自定义颜色映射
colors = ['darkred', 'red', 'orange', 'yellow', 'white', 'lightblue', 'blue', 'darkblue']
n_bins = 100 # 颜色的数量
cmap = LinearSegmentedColormap.from_list('custom_cmap', colors, N=n_bins)
# 生成数据
x = np.linspace(-2, 2, 100)
y = np.linspace(-2, 2, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)
plt.figure(figsize=(10, 8))
# 使用自定义颜色映射
contour = plt.contourf(X, Y, Z, cmap=cmap)
plt.colorbar(contour, label='Z values')
plt.title('Custom Colormap Example - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
这个示例创建了一个从深红色到深蓝色的自定义颜色映射,并将其应用到等高线填充图中。自定义颜色映射允许我们精确控制颜色的过渡,以最好地表达数据的特征。
12. 颜色循环和样式循环
在绘制多个数据系列时,Matplotlib 会自动循环使用不同的颜色和线条样式。我们可以自定义这些循环以满足特定的可视化需求。
以下是一个自定义颜色和样式循环的示例:
import matplotlib.pyplot as plt
import numpy as np
from cycler import cycler
# 自定义颜色和线条样式循环
colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd']
linestyles = ['-', '--', '-.', ':', '-']
plt.rc('axes', prop_cycle=(cycler('color', colors) +
cycler('linestyle', linestyles)))
# 生成数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
y4 = x**2
y5 = x**3
plt.figure(figsize=(12, 8))
# 绘制多条曲线
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)')
plt.plot(x, y3, label='tan(x)')
plt.plot(x, y4, label='x^2')
plt.plot(x, y5, label='x^3')
plt.title('Custom Color and Style Cycles - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.grid(True)
plt.show()
Output:
这个示例展示了如何自定义颜色和线条样式的循环。通过设置 plt.rc('axes', prop_cycle=...)
,我们可以控制每条新线的颜色和样式。
13. 颜色映射的离散化
有时我们可能希望将连续的颜色映射离散化,以创建更清晰的颜色边界。Matplotlib 提供了 BoundaryNorm
类来实现这一功能。
以下是一个颜色映射离散化的示例:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import BoundaryNorm
from matplotlib.cm import get_cmap
# 生成数据
x = np.linspace(-3, 3, 100)
y = np.linspace(-3, 3, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) * np.cos(Y)
# 定义离散化的边界和颜色数量
levels = [-1, -0.5, 0, 0.5, 1]
n_colors = len(levels) - 1
cmap = get_cmap('RdYlBu_r', n_colors)
# 创建离散化的标准化对象
norm = BoundaryNorm(levels, ncolors=cmap.N)
plt.figure(figsize=(10, 8))
# 使用离散化的颜色映射
contour = plt.contourf(X, Y, Z, levels=levels, cmap=cmap, norm=norm)
plt.colorbar(contour, label='Z values', ticks=levels)
plt.title('Discretized Colormap Example - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
这个示例将连续的 ‘RdYlBu_r’ 颜色映射离散化为 4 个区间。这种方法可以帮助观察者更容易地识别数据落入的具体区间。
14. 颜色盲友好的配色方案
在创建数据可视化时,考虑颜色盲用户的需求是很重要的。Matplotlib 提供了一些颜色盲友好的颜色映射,如 ‘viridis’、’plasma’ 等。
以下是一个使用颜色盲友好配色方案的示例:
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
categories = ['A', 'B', 'C', 'D', 'E']
values1 = [23, 45, 56, 78, 32]
values2 = [18, 36, 47, 62, 41]
# 使用颜色盲友好的颜色
colors = plt.cm.viridis([0.1, 0.3, 0.5, 0.7, 0.9])
plt.figure(figsize=(12, 6))
# 创建分组条形图
x = np.arange(len(categories))
width = 0.35
plt.bar(x - width/2, values1, width, color=colors, label='Group 1')
plt.bar(x + width/2, values2, width, color=colors, alpha=0.6, label='Group 2')
plt.title('Color-Blind Friendly Chart - how2matplotlib.com')
plt.xlabel('Categories')
plt.ylabel('Values')
plt.xticks(x, categories)
plt.legend()
plt.show()
Output:
这个示例使用了 ‘viridis’ 颜色映射,这是一个被设计为颜色盲友好的配色方案。通过选择适当的颜色和使用透明度,我们可以创建出既美观又易于理解的图表。
15. 使用 Seaborn 调色板
Seaborn 是基于 Matplotlib 的统计数据可视化库,它提供了许多美观的调色板。我们可以在 Matplotlib 中使用 Seaborn 的调色板来增强图表的视觉效果。
以下是一个使用 Seaborn 调色板的示例:
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
# 设置 Seaborn 样式
sns.set_style("whitegrid")
# 生成数据
categories = ['A', 'B', 'C', 'D', 'E']
values = [23, 45, 56, 78, 32]
# 使用 Seaborn 的调色板
colors = sns.color_palette("husl", len(categories))
plt.figure(figsize=(10, 6))
# 创建条形图
bars = plt.bar(categories, values, color=colors)
plt.title('Using Seaborn Color Palette in Matplotlib - how2matplotlib.com')
plt.xlabel('Categories')
plt.ylabel('Values')
# 添加数值标签
for bar in bars:
height = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2., height,
f'{height}', ha='center', va='bottom')
plt.show()
Output:
这个示例展示了如何在 Matplotlib 中使用 Seaborn 的 “husl” 调色板。Seaborn 的调色板通常提供更加和谐和美观的颜色组合,可以提升图表的整体视觉效果。
结论
通过本文,我们深入探讨了 Matplotlib 中的颜色列表和相关技巧。从基本的颜色表示方法到高级的颜色映射和自定义技巧,我们涵盖了广泛的主题。掌握这些技巧将帮助您创建更加专业、美观和有效的数据可视化图表。
记住,选择合适的颜色不仅可以增强图表的美观度,还可以提高数据的可读性和解释性。在实际应用中,根据数据的特性和目标受众来选择合适的颜色方案至关重要。