Matplotlib 从表格数据创建自定义色彩映射的全面指南

Matplotlib 从表格数据创建自定义色彩映射的全面指南

参考:matplotlib colormaps from table

MatplotlibPython 中最流行的数据可视化库之一,它提供了丰富的绘图功能和自定义选项。其中,色彩映射(colormaps)是一种强大的工具,可以帮助我们更好地展示数据的分布和变化。本文将详细介绍如何从表格数据创建自定义色彩映射,并探讨其在数据可视化中的应用。

1. 色彩映射的基本概念

色彩映射是一种将数值映射到颜色的方法。在数据可视化中,我们经常使用色彩映射来表示数据的大小、强度或其他属性。Matplotlib 提供了许多内置的色彩映射,但有时我们需要根据特定需求创建自定义的色彩映射。

以下是一个使用内置色彩映射的简单示例:

import matplotlib.pyplot as plt
import numpy as np

# 创建数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

# 绘制彩色线条
plt.figure(figsize=(10, 6))
plt.scatter(x, y, c=y, cmap='viridis')
plt.colorbar(label='Sin(x)')
plt.title('How2Matplotlib.com: Basic Colormap Example')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib 从表格数据创建自定义色彩映射的全面指南

在这个例子中,我们使用了 ‘viridis’ 色彩映射来表示 sin(x) 函数的值。点的颜色随着 y 值的变化而变化。

2. 从表格数据创建自定义色彩映射

虽然 Matplotlib 提供了许多内置的色彩映射,但有时我们需要根据特定的数据或设计要求创建自定义的色彩映射。从表格数据创建色彩映射是一种灵活的方法,可以精确控制颜色的分布。

2.1 使用 ListedColormap 创建离散色彩映射

ListedColormap 是 Matplotlib 中用于创建离散色彩映射的类。我们可以从表格数据中提取颜色信息,然后使用这些颜色创建自定义的色彩映射。

以下是一个从表格数据创建离散色彩映射的示例:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormap

# 模拟表格数据
color_data = [
    ['Category A', '#FF0000'],
    ['Category B', '#00FF00'],
    ['Category C', '#0000FF'],
    ['Category D', '#FFFF00']
]

# 提取颜色
colors = [row[1] for row in color_data]

# 创建自定义色彩映射
custom_cmap = ListedColormap(colors)

# 创建示例数据
data = np.random.randint(0, 4, (10, 10))

# 绘制热图
plt.figure(figsize=(10, 8))
plt.imshow(data, cmap=custom_cmap)
plt.colorbar(ticks=range(4), label='Categories')
plt.title('How2Matplotlib.com: Custom Discrete Colormap')
plt.show()

Output:

Matplotlib 从表格数据创建自定义色彩映射的全面指南

在这个例子中,我们首先模拟了一个包含类别和对应颜色的表格数据。然后,我们提取颜色信息并使用 ListedColormap 创建了一个自定义的离散色彩映射。最后,我们使用这个自定义色彩映射绘制了一个热图。

2.2 使用 LinearSegmentedColormap 创建连续色彩映射

对于需要平滑过渡的连续数据,我们可以使用 LinearSegmentedColormap 创建自定义的连续色彩映射。这种方法允许我们定义颜色的渐变过程。

以下是一个从表格数据创建连续色彩映射的示例:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap

# 模拟表格数据
color_data = [
    [0.0, '#FF0000'],
    [0.5, '#FFFF00'],
    [1.0, '#00FF00']
]

# 提取颜色和位置
positions = [row[0] for row in color_data]
colors = [row[1] for row in color_data]

# 创建自定义色彩映射
custom_cmap = LinearSegmentedColormap.from_list("How2Matplotlib_cmap", list(zip(positions, colors)))

# 创建示例数据
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=(10, 8))
plt.contourf(X, Y, Z, cmap=custom_cmap, levels=20)
plt.colorbar(label='Z value')
plt.title('How2Matplotlib.com: Custom Continuous Colormap')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib 从表格数据创建自定义色彩映射的全面指南

在这个例子中,我们定义了一个包含颜色和对应位置的表格数据。然后,我们使用 LinearSegmentedColormap.from_list() 方法创建了一个自定义的连续色彩映射。最后,我们使用这个自定义色彩映射绘制了一个等高线图。

3. 色彩映射的高级应用

创建自定义色彩映射后,我们可以在各种数据可视化场景中应用它们。以下是一些高级应用的示例。

3.1 多变量数据可视化

当我们需要同时展示多个变量时,自定义色彩映射可以帮助我们更好地区分和理解数据。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap

# 创建自定义色彩映射
colors = ['#FF0000', '#00FF00', '#0000FF']
n_bins = 100
custom_cmap = LinearSegmentedColormap.from_list("How2Matplotlib_cmap", colors, N=n_bins)

# 创建示例数据
x = np.random.randn(1000)
y = np.random.randn(1000)
z = np.random.randn(1000)

# 绘制散点图
plt.figure(figsize=(10, 8))
scatter = plt.scatter(x, y, c=z, cmap=custom_cmap, alpha=0.6)
plt.colorbar(scatter, label='Z value')
plt.title('How2Matplotlib.com: Multi-variable Visualization')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib 从表格数据创建自定义色彩映射的全面指南

在这个例子中,我们使用自定义色彩映射来表示第三个变量 z 的值,从而在二维平面上展示了三个变量的关系。

3.2 时间序列数据可视化

对于时间序列数据,我们可以使用自定义色彩映射来强调时间的变化。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
import pandas as pd

# 创建自定义色彩映射
colors = ['#FFA07A', '#20B2AA', '#9370DB']
custom_cmap = LinearSegmentedColormap.from_list("How2Matplotlib_cmap", colors)

# 创建示例数据
dates = pd.date_range(start='2023-01-01', end='2023-12-31', freq='D')
values = np.cumsum(np.random.randn(len(dates)))

# 绘制时间序列图
plt.figure(figsize=(12, 6))
scatter = plt.scatter(dates, values, c=range(len(dates)), cmap=custom_cmap)
plt.colorbar(scatter, label='Time progression')
plt.title('How2Matplotlib.com: Time Series Visualization')
plt.xlabel('Date')
plt.ylabel('Value')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

Output:

Matplotlib 从表格数据创建自定义色彩映射的全面指南

在这个例子中,我们使用自定义色彩映射来表示时间的推移,使得数据的时间变化更加直观。

3.3 地理数据可视化

自定义色彩映射在地理数据可视化中也有广泛应用,可以帮助我们更好地展示地理特征。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap

# 创建自定义色彩映射
colors = ['#3288BD', '#66C2A5', '#ABDDA4', '#E6F598', '#FEE08B', '#FDAE61', '#F46D43', '#D53E4F']
custom_cmap = LinearSegmentedColormap.from_list("How2Matplotlib_cmap", colors)

# 创建示例地理数据
lon = np.linspace(-180, 180, 360)
lat = np.linspace(-90, 90, 180)
lon, lat = np.meshgrid(lon, lat)
data = np.sin(np.radians(lon)) * np.cos(np.radians(lat))

# 绘制地理热图
plt.figure(figsize=(12, 8))
plt.contourf(lon, lat, data, cmap=custom_cmap, levels=20)
plt.colorbar(label='Value')
plt.title('How2Matplotlib.com: Geographic Data Visualization')
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plt.show()

Output:

Matplotlib 从表格数据创建自定义色彩映射的全面指南

在这个例子中,我们使用自定义色彩映射来可视化模拟的地理数据,展示了如何在地图上表现数据的分布。

4. 色彩映射的优化和调整

创建有效的色彩映射不仅仅是选择颜色那么简单。我们需要考虑色彩的感知、数据的特性以及可访问性等因素。

4.1 色彩感知的考虑

人眼对不同颜色的感知是不同的。例如,我们对绿色的变化比蓝色更敏感。因此,在创建色彩映射时,我们需要考虑这些感知差异。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap

# 创建考虑感知的色彩映射
colors = ['#FFFFFF', '#FFEDA0', '#FEB24C', '#F03B20']
perceptual_cmap = LinearSegmentedColormap.from_list("How2Matplotlib_perceptual", colors)

# 创建线性色彩映射作为对比
linear_colors = ['#FFFFFF', '#FFBF80', '#FF8000', '#FF0000']
linear_cmap = LinearSegmentedColormap.from_list("How2Matplotlib_linear", linear_colors)

# 创建示例数据
data = np.random.rand(10, 10)

# 绘制对比图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

im1 = ax1.imshow(data, cmap=perceptual_cmap)
ax1.set_title('How2Matplotlib.com: Perceptual Colormap')
plt.colorbar(im1, ax=ax1)

im2 = ax2.imshow(data, cmap=linear_cmap)
ax2.set_title('How2Matplotlib.com: Linear Colormap')
plt.colorbar(im2, ax=ax2)

plt.tight_layout()
plt.show()

Output:

Matplotlib 从表格数据创建自定义色彩映射的全面指南

在这个例子中,我们对比了考虑感知的色彩映射和简单的线性色彩映射。考虑感知的色彩映射可以更好地展示数据的细微变化。

4.2 数据分布的考虑

数据的分布特性也应该影响我们如何创建和应用色彩映射。例如,对于偏斜分布的数据,我们可能需要使用非线性的色彩映射。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap, PowerNorm

# 创建自定义色彩映射
colors = ['#FFFFCC', '#A1DAB4', '#41B6C4', '#2C7FB8', '#253494']
custom_cmap = LinearSegmentedColormap.from_list("How2Matplotlib_cmap", colors)

# 创建偏斜分布的数据
data = np.random.pareto(1, size=(20, 20))

# 绘制对比图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

im1 = ax1.imshow(data, cmap=custom_cmap)
ax1.set_title('How2Matplotlib.com: Linear Scaling')
plt.colorbar(im1, ax=ax1)

im2 = ax2.imshow(data, cmap=custom_cmap, norm=PowerNorm(gamma=0.5))
ax2.set_title('How2Matplotlib.com: Power-law Scaling')
plt.colorbar(im2, ax=ax2)

plt.tight_layout()
plt.show()

Output:

Matplotlib 从表格数据创建自定义色彩映射的全面指南

在这个例子中,我们对比了线性缩放和幂律缩放对偏斜分布数据的影响。幂律缩放可以更好地展示数据的细节。

4.3 可访问性考虑

创建色彩映射时,我们还需要考虑色盲用户的需求。选择对色盲友好的颜色组合可以确保我们的可视化对所有用户都有效。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap

# 创建色盲友好的色彩映射
colors = ['#FFFFB2', '#FECC5C', '#FD8D3C', '#F03B20', '#BD0026']
colorblind_friendly_cmap = LinearSegmentedColormap.from_list("How2Matplotlib_colorblind", colors)

# 创建示例数据
data = np.random.rand(10, 10)

# 绘制热图
plt.figure(figsize=(10, 8))
plt.imshow(data, cmap=colorblind_friendly_cmap)
plt.colorbar(label='Value')
plt.title('How2Matplotlib.com: Colorblind-friendly Colormap')
plt.show()

Output:

Matplotlib 从表格数据创建自定义色彩映射的全面指南

在这个例子中,我们使用了一组色盲友好的颜色来创建色彩映射。这些颜色即使对色盲用户来说也是可区分的。

5. 从复杂表格数据创建色彩映射

有时,我们可能需要从更复杂的表格数据创建色彩映射。这可能涉及到多个变量或非线性的颜色变化。

5.1 多变量色彩映射

当我们有多个变量需要在同一个色彩映射中表示时,可以使用更复杂的方法来创建色彩映射。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap

# 模拟复杂表格数据
color_data = [
    [0.0, 0.0, '#FF0000'],
    [0.0, 1.0, '#00FF00'],
    [1.0, 0.0, '#0000FF'],
    [1.0, 1.0, '#FFFF00']
]

# 创建自定义色彩映射函数
def custom_color_func(x, y):
    distances = [np.sqrt((x-row[0])**2 + (y-row[1])**2) for row in color_data]
    weights = [1/d if d > 0 else 1e10 for d in distances]
    total_weight = sum(weights)
    r = sum(int(row[2][1:3], 16) * w / total_weight for row, w in zip(color_data, weights))
    g = sum(int(row[2][3:5], 16) * w / total_weight for row, w in zip(color_data, weights))
    b = sum(int(row[2][5:7], 16) * w / total_weight for row, w in zip(color_data, weights))
    return (r/255, g/255, b/255)

# 创建色彩映射
n_bins = 100
custom_cmap = LinearSegmentedColormap.from_list("How2Matplotlib_multi", 
    [custom_color_func(x/n_bins, y/n_bins) for x in range(n_bins) for y in range(n_bins)], N=n_bins)

# 创建示例数据
x = np.linspace(0, 1, 100)
y = np.linspace(0, 1, 100)
X, Y = np.meshgrid(x, y)

# 绘制色彩映射
plt.figure(figsize=(10, 8))
plt.imshow(custom_cmap(np.dstack([X, Y])))
plt.title('How2Matplotlib.com: Multi-variable Colormap')
plt.xlabel('Variable 1')
plt.ylabel('Variable 2')
plt.colorbar(label='Color')
plt.show()

在这个例子中,我们创建了一个基于两个变量的色彩映射。颜色是根据与四个基准点的距离加权平均计算得出的。

5.2 非线性色彩映射

对于某些数据集,我们可能需要非线性的色彩变化来更好地表示数据。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap

# 模拟非线性表格数据
color_data = [
    [0.0, '#FF0000'],
    [0.2, '#FF7F00'],
    [0.5, '#FFFF00'],
    [0.9, '#00FF00'],
    [1.0, '#0000FF']
]

# 创建非线性色彩映射
positions = [row[0] for row in color_data]
colors = [row[1] for row in color_data]
nonlinear_cmap = LinearSegmentedColormap.from_list("How2Matplotlib_nonlinear", list(zip(positions, colors)))

# 创建示例数据
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=(10, 8))
plt.contourf(X, Y, Z, cmap=nonlinear_cmap, levels=20)
plt.colorbar(label='Value')
plt.title('How2Matplotlib.com: Non-linear Colormap')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib 从表格数据创建自定义色彩映射的全面指南

在这个例子中,我们创建了一个非线性的色彩映射,其中颜色变化的速率在不同区间是不同的。这种方法可以用来强调数据中的特定范围。

6. 色彩映射的评估和比较

创建自定义色彩映射后,我们需要评估其效果并与其他色彩映射进行比较。

6.1 色彩映射的视觉评估

我们可以创建一个函数来可视化色彩映射,以便直观地评估其效果。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap

def plot_colormap(cmap, title):
    gradient = np.linspace(0, 1, 256)
    gradient = np.vstack((gradient, gradient))

    fig, ax = plt.subplots(figsize=(10, 3))
    ax.imshow(gradient, aspect='auto', cmap=cmap)
    ax.set_title(f'How2Matplotlib.com: {title}')
    ax.set_axis_off()
    plt.show()

# 创建自定义色彩映射
colors = ['#FF0000', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF']
custom_cmap = LinearSegmentedColormap.from_list("How2Matplotlib_custom", colors)

# 评估自定义色彩映射
plot_colormap(custom_cmap, "Custom Colormap")

# 比较内置色彩映射
plot_colormap(plt.get_cmap('viridis'), "Viridis Colormap")
plot_colormap(plt.get_cmap('jet'), "Jet Colormap")

这个例子创建了一个函数来可视化色彩映射,并用它来比较自定义色彩映射和内置色彩映射。

6.2 色彩映射的数值评估

除了视觉评估,我们还可以使用数值方法来评估色彩映射的性能。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
from colorspacious import cspace_converter

def evaluate_colormap(cmap, n_samples=256):
    rgb = cmap(np.linspace(0, 1, n_samples))[:, :3]
    lab = cspace_converter("sRGB1", "CAM02-UCS")(rgb)

    lightness = lab[:, 0]
    contrast_ratio = (lightness.max() + 0.05) / (lightness.min() + 0.05)

    deltas = np.diff(lab, axis=0)
    perceptual_deltas = np.sqrt((deltas**2).sum(axis=1))

    return {
        'contrast_ratio': contrast_ratio,
        'perceptual_deltas': perceptual_deltas
    }

# 创建自定义色彩映射
colors = ['#FF0000', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF']
custom_cmap = LinearSegmentedColormap.from_list("How2Matplotlib_custom", colors)

# 评估色彩映射
custom_eval = evaluate_colormap(custom_cmap)
viridis_eval = evaluate_colormap(plt.get_cmap('viridis'))

# 绘制评估结果
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8))

ax1.plot(custom_eval['perceptual_deltas'], label='Custom')
ax1.plot(viridis_eval['perceptual_deltas'], label='Viridis')
ax1.set_title('How2Matplotlib.com: Perceptual Deltas')
ax1.set_xlabel('Color Index')
ax1.set_ylabel('Perceptual Delta')
ax1.legend()

ax2.bar(['Custom', 'Viridis'], [custom_eval['contrast_ratio'], viridis_eval['contrast_ratio']])
ax2.set_title('How2Matplotlib.com: Contrast Ratio')
ax2.set_ylabel('Contrast Ratio')

plt.tight_layout()
plt.show()

这个例子计算了色彩映射的感知均匀性和对比度比,并将结果可视化以便比较不同的色彩映射。

7. 色彩映射在特定领域的应用

不同的领域可能需要特定的色彩映射来更好地表达数据。让我们看几个例子。

7.1 科学数据可视化

在科学数据可视化中,我们通常需要精确和客观的色彩映射。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap

# 创建科学数据友好的色彩映射
colors = ['#000080', '#0000FF', '#00FFFF', '#FFFFFF', '#FFFF00', '#FF0000', '#800000']
science_cmap = LinearSegmentedColormap.from_list("How2Matplotlib_science", colors)

# 创建示例数据
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

# 绘制科学数据可视化
plt.figure(figsize=(10, 8))
plt.contourf(X, Y, Z, cmap=science_cmap, levels=20)
plt.colorbar(label='Value')
plt.title('How2Matplotlib.com: Scientific Data Visualization')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Output:

Matplotlib 从表格数据创建自定义色彩映射的全面指南

这个例子创建了一个适合科学数据可视化的色彩映射,它具有良好的对比度和连续性。

7.2 地理信息系统(GIS)数据可视化

GIS 数据通常需要特殊的色彩映射来表示地形或其他地理特征。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap

# 创建地形色彩映射
terrain_colors = ['#053061', '#2166AC', '#4393C3', '#92C5DE', '#D1E5F0', 
                  '#F7F7F7', '#FDDBC7', '#F4A582', '#D6604D', '#B2182B', '#67001F']
terrain_cmap = LinearSegmentedColormap.from_list("How2Matplotlib_terrain", terrain_colors)

# 创建示例地形数据
x = np.linspace(0, 10, 100)
y = np.linspace(0, 10, 100)
X, Y = np.meshgrid(x, y)
Z = 2 * np.sin(X) * np.cos(Y) + np.random.rand(100, 100) * 0.5

# 绘制地形图
plt.figure(figsize=(10, 8))
plt.contourf(X, Y, Z, cmap=terrain_cmap, levels=20)
plt.colorbar(label='Elevation')
plt.title('How2Matplotlib.com: GIS Data Visualization')
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plt.show()

Output:

Matplotlib 从表格数据创建自定义色彩映射的全面指南

这个例子创建了一个适合表示地形的色彩映射,从深蓝色(代表深水)到棕红色(代表高海拔)。

7.3 医学图像可视化

医学图像通常需要特殊的色彩映射来突出显示特定的组织或异常。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap

# 创建医学图像色彩映射
medical_colors = ['#000000', '#0000FF', '#00FFFF', '#FFFFFF', '#FFFF00', '#FF0000']
medical_cmap = LinearSegmentedColormap.from_list("How2Matplotlib_medical", medical_colors)

# 创建示例医学图像数据
image_size = 256
center = image_size // 2
Y, X = np.ogrid[:image_size, :image_size]
dist_from_center = np.sqrt((X - center)**2 + (Y-center)**2)
image = np.exp(-dist_from_center / (image_size * 0.1))
image += 0.2 * np.random.randn(image_size, image_size)

# 绘制医学图像
plt.figure(figsize=(10, 8))
plt.imshow(image, cmap=medical_cmap)
plt.colorbar(label='Intensity')
plt.title('How2Matplotlib.com: Medical Image Visualization')
plt.axis('off')
plt.show()

Output:

Matplotlib 从表格数据创建自定义色彩映射的全面指南

这个例子创建了一个适合医学图像的色彩映射,它可以突出显示不同强度的区域。

8. 色彩映射的动态调整

有时,我们可能需要在运行时动态调整色彩映射。Matplotlib 提供了一些工具来实现这一点。

8.1 使用 Normalize 对象调整色彩映射

我们可以使用 Normalize 对象来调整色彩映射的范围和分布。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import Normalize

# 创建示例数据
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)

# 创建动态调整的图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))

im1 = ax1.imshow(Z, cmap='viridis')
fig.colorbar(im1, ax=ax1, label='Value')
ax1.set_title('How2Matplotlib.com: Default Normalization')

norm = Normalize(vmin=-0.5, vmax=0.5)
im2 = ax2.imshow(Z, cmap='viridis', norm=norm)
fig.colorbar(im2, ax=ax2, label='Value')
ax2.set_title('How2Matplotlib.com: Custom Normalization')

plt.show()

Output:

Matplotlib 从表格数据创建自定义色彩映射的全面指南

在这个例子中,我们使用 Normalize 对象来调整色彩映射的范围,从而突出显示数据中的特定区域。

8.2 使用 FuncNorm 创建非线性色彩映射

对于需要非线性映射的数据,我们可以使用 FuncNorm。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import FuncNorm

# 创建示例数据
x = np.linspace(0, 10, 100)
y = np.linspace(0, 10, 100)
X, Y = np.meshgrid(x, y)
Z = np.exp(-(X-5)**2/10 - (Y-5)**2/10)

# 创建非线性映射
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))

im1 = ax1.imshow(Z, cmap='viridis')
fig.colorbar(im1, ax=ax1, label='Value')
ax1.set_title('How2Matplotlib.com: Linear Normalization')

norm = FuncNorm((lambda x: x**0.5, lambda x: x**(1/0.5)), vmin=Z.min(), vmax=Z.max())
im2 = ax2.imshow(Z, cmap='viridis', norm=norm)
fig.colorbar(im2, ax=ax2, label='Value')
ax2.set_title('How2Matplotlib.com: Non-linear Normalization')

plt.show()

Output:

Matplotlib 从表格数据创建自定义色彩映射的全面指南

这个例子使用 FuncNorm 创建了一个非线性的色彩映射,可以更好地显示数据的细节。

9. 色彩映射的保存和加载

创建了自定义色彩映射后,我们可能希望保存它以便将来使用。

9.1 保存色彩映射

我们可以将色彩映射保存为 .npy 文件。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap

# 创建自定义色彩映射
colors = ['#FF0000', '#00FF00', '#0000FF']
custom_cmap = LinearSegmentedColormap.from_list("How2Matplotlib_custom", colors)

# 将色彩映射转换为数组
cmap_array = custom_cmap(np.linspace(0, 1, 256))

# 保存色彩映射
np.save('how2matplotlib_custom_cmap.npy', cmap_array)

print("Color map saved successfully.")

9.2 加载色彩映射

我们可以从保存的文件中加载色彩映射。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap

# 加载色彩映射
loaded_cmap_array = np.load('how2matplotlib_custom_cmap.npy')
loaded_cmap = LinearSegmentedColormap.from_list("How2Matplotlib_loaded", loaded_cmap_array)

# 创建示例数据
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=(10, 8))
plt.contourf(X, Y, Z, cmap=loaded_cmap, levels=20)
plt.colorbar(label='Value')
plt.title('How2Matplotlib.com: Loaded Custom Colormap')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

这个例子展示了如何加载之前保存的色彩映射并在新的图表中使用它。

10. 结论

从表格数据创建自定义色彩映射是一个强大的工具,可以帮助我们更好地可视化和理解数据。通过本文介绍的方法,我们可以创建适合特定数据和应用场景的色彩映射,从而提高数据可视化的效果和可读性。

在创建和使用自定义色彩映射时,我们需要考虑以下几点:

  1. 数据的特性:了解数据的分布和范围,选择合适的色彩映射方法。
  2. 视觉感知:考虑人眼对不同颜色的感知差异,创建感知均匀的色彩映射。
  3. 可访问性:确保色彩映射对色盲用户友好。
  4. 应用场景:根据特定领域的需求调整色彩映射。
  5. 动态调整:使用 Normalize 和 FuncNorm 等工具动态调整色彩映射。
  6. 评估和比较:使用视觉和数值方法评估色彩映射的效果。

通过掌握这些技巧,我们可以创建出既美观又有效的数据可视化,更好地传达数据中的信息和洞察。

记住,创建有效的色彩映射是一个需要不断实践和改进的过程。随着经验的积累,我们将能够更好地选择和创建适合各种数据和场景的色彩映射。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程