简介
本实验将探讨如何使用 Python 的 Matplotlib 库设置颜色透明度(alpha 值)。在数据可视化中,透明度是一种强大的工具,它可以揭示重叠元素中的模式,或突出显示某些数据点。
Matplotlib 中的 alpha 值范围从 0 到 1:
- 0 表示完全透明(不可见)
- 1 表示完全不透明(实心)
- 0 到 1 之间的值会创建不同程度的透明度
我们将探讨在 Matplotlib 中设置 alpha 值的两种主要方法:
- 使用
alpha关键字参数 - 使用
(matplotlib_color, alpha)颜色格式
在本实验结束时,你将能够创建具有自定义透明度设置的可视化图表,从而提升数据展示效果。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到 Notebook 标签页,即可访问 Jupyter Notebook 进行练习。

你可能需要等待几秒钟,让 Jupyter Notebook 加载完成。由于 Jupyter Notebook 的限制,操作验证无法实现自动化。
如果你在实验过程中遇到任何问题,请随时向 Labby 寻求帮助。实验结束后,我们希望你能提供反馈,以帮助我们改进实验体验。
理解 Matplotlib 中的 Alpha 值
在第一步中,我们将创建一个 Jupyter Notebook,并学习如何使用 alpha 值设置基本的可视化图表。
创建你的第一个 Jupyter Notebook 单元格
在这个单元格中,我们将导入必要的库,并创建两个具有不同 alpha 值的重叠圆形,以演示透明度。
import matplotlib.pyplot as plt
import numpy as np
## Create a figure and an axes
fig, ax = plt.subplots(figsize=(6, 4))
## Create a circle with alpha=1.0 (completely opaque)
circle1 = plt.Circle((0.5, 0.5), 0.3, color='blue', alpha=1.0, label='Opaque (alpha=1.0)')
## Create a circle with alpha=0.5 (semi-transparent)
circle2 = plt.Circle((0.7, 0.5), 0.3, color='red', alpha=0.5, label='Semi-transparent (alpha=0.5)')
## Add circles to the axes
ax.add_patch(circle1)
ax.add_patch(circle2)
## Set axis limits
ax.set_xlim(0, 1.2)
ax.set_ylim(0, 1)
## Add a title and legend
ax.set_title('Demonstrating Alpha Values in Matplotlib')
ax.legend(loc='upper right')
## Show the plot
plt.show()
在单元格中输入此代码后,按下 Shift+Enter 或点击工具栏中的“Run”按钮来运行它。
理解输出结果
你应该会看到两个重叠的圆形:
- 左边的蓝色圆形是完全不透明的(alpha=1.0)
- 右边的红色圆形是半透明的(alpha=0.5)
注意在两个圆形重叠的部分,你可以透过红色圆形看到蓝色圆形。这就是将红色圆形的 alpha 值设置为 0.5 所产生的效果。
Alpha 值可以控制可视化图表中的透明度,在以下情况下会很有帮助:
- 展示重叠的数据点
- 突出显示某些元素
- 减少密集图表中的视觉干扰
- 创建分层的可视化图表
让我们在下一步中继续探索 alpha 值的更多应用。
创建具有统一 Alpha 值的条形图
在这一步中,我们将使用 alpha 关键字参数创建一个条形图,其中所有条形都具有相同的透明度级别。
添加新单元格
通过点击工具栏中的“+”按钮,或者在命令模式下按“Esc”然后按“b”,在你的 Jupyter Notebook 中添加一个新单元格。
创建具有统一 Alpha 值的条形图
在新单元格中输入并运行以下代码:
import matplotlib.pyplot as plt
import numpy as np
## Set a random seed for reproducibility
np.random.seed(19680801)
## Create a figure and an axes
fig, ax = plt.subplots(figsize=(10, 6))
## Generate data
x_values = list(range(20)) ## 0 to 19
y_values = np.random.randn(20) ## 20 random values from standard normal distribution
## Determine bar colors based on y-values (green for positive, red for negative)
facecolors = ['green' if y > 0 else 'red' for y in y_values]
edgecolors = facecolors ## Same color for edges
## Create the bar chart with alpha=0.5 for all bars
ax.bar(x_values, y_values, color=facecolors, edgecolor=edgecolors, alpha=0.5)
## Add a title and labels
ax.set_title("Bar Chart with Uniform Alpha Value (alpha=0.5)")
ax.set_xlabel("X Values")
ax.set_ylabel("Y Values")
## Add a grid for better readability
ax.grid(True, linestyle='--', alpha=0.7)
## Show the plot
plt.show()
理解代码和输出
运行代码后,你应该会看到一个包含 20 个条形的条形图。每个条形要么是绿色(y 值为正),要么是红色(y 值为负),并且具有相同的透明度级别(alpha=0.5)。
让我们来分析一下关键部分:
np.random.seed(19680801)—— 这确保了你每次运行代码时生成的随机数都是相同的。x_values = list(range(20))—— 创建一个从 0 到 19 的整数列表,用于 x 轴。y_values = np.random.randn(20)—— 从标准正态分布中生成 20 个随机值,用于 y 轴。facecolors = ['green' if y > 0 else 'red' for y in y_values]—— 这个列表推导式将正值设为绿色,负值设为红色。ax.bar(..., alpha=0.5)—— 这是为所有条形设置统一 alpha 值 0.5 的关键部分。
统一的 alpha 值使所有条形具有相同的透明度,当你想要实现以下目的时,这会很有用:
- 透过条形显示背景网格线
- 创建更柔和的可视化效果
- 同等程度地减少所有元素的视觉主导性
在下一步中,我们将探索如何为不同的条形设置不同的 alpha 值。
创建具有不同 Alpha 值的条形图
在这一步中,我们将使用 (matplotlib_color, alpha) 元组格式,根据每个条形的数据值为其分配不同的透明度级别。
添加新单元格
通过点击工具栏中的“+”按钮,或者在命令模式下按“Esc”然后按“b”,在你的 Jupyter Notebook 中添加一个新单元格。
创建具有不同 Alpha 值的条形图
在新单元格中输入并运行以下代码:
import matplotlib.pyplot as plt
import numpy as np
## Set a random seed for reproducibility
np.random.seed(19680801)
## Create a figure and an axes
fig, ax = plt.subplots(figsize=(10, 6))
## Generate data (using the same data as in Step 2 for comparison)
x_values = list(range(20)) ## 0 to 19
y_values = np.random.randn(20) ## 20 random values from standard normal distribution
## Determine bar colors based on y-values (green for positive, red for negative)
facecolors = ['green' if y > 0 else 'red' for y in y_values]
edgecolors = facecolors ## Same color for edges
## Calculate alpha values based on the absolute y-values
## Normalize y values to get alpha values between 0.2 and 1.0
abs_y = [abs(y) for y in y_values]
max_abs_y = max(abs_y)
face_alphas = [0.2 + 0.8 * (val / max_abs_y) for val in abs_y]
## Create color-alpha tuples for each bar
colors_with_alphas = list(zip(facecolors, face_alphas))
## Create the bar chart with varying alpha values
ax.bar(x_values, y_values, color=colors_with_alphas, edgecolor=edgecolors)
## Add a title and labels
ax.set_title("Bar Chart with Varying Alpha Values Based on Bar Height")
ax.set_xlabel("X Values")
ax.set_ylabel("Y Values")
## Add a grid for better readability
ax.grid(True, linestyle='--', alpha=0.7)
## Show the plot
plt.show()
理解代码和输出
运行代码后,你应该会看到一个包含 20 个条形的条形图。每个条形的透明度级别与其 y 值的绝对值成正比 —— 较高的条形更不透明,较短的条形更透明。
让我们来分析一下代码的关键部分:
abs_y = [abs(y) for y in y_values]—— 这会创建一个包含所有 y 值绝对值的列表。max_abs_y = max(abs_y)—— 找到最大的绝对值,以便对数据进行归一化处理。face_alphas = [0.2 + 0.8 * (val / max_abs_y) for val in abs_y]—— 根据归一化后的 y 值绝对值,计算出介于 0.2 和 1.0 之间的 alpha 值。colors_with_alphas = list(zip(facecolors, face_alphas))—— 通过将每种颜色与其对应的 alpha 值配对,创建一个(颜色, alpha)元组列表。ax.bar(..., color=colors_with_alphas, ...)—— 使用(颜色, alpha)元组为每个条形设置不同的 alpha 值。
这种使用不同透明度级别的方法在以下方面非常有效:
- 强调更重要的数据点
- 弱化不太重要的数据点
- 根据数据值创建视觉层次结构
- 为你的可视化图表添加额外的信息维度
你可以清楚地看到,不同的 alpha 值如何产生一种视觉效果,即数据点的大小不仅通过条形的高度,还通过其不透明度得到强调。
创建带有 Alpha 值的散点图
在这一步中,我们将运用对 alpha 值的了解来创建一个散点图。这将展示透明度如何有助于在存在重叠点的散点图中可视化数据密度。
添加新单元格
通过点击工具栏中的“+”按钮,或者在命令模式下按“Esc”然后按“b”,在你的 Jupyter Notebook 中添加一个新单元格。
创建带有透明度的散点图
在新单元格中输入并运行以下代码:
import matplotlib.pyplot as plt
import numpy as np
## Set a random seed for reproducibility
np.random.seed(19680801)
## Create a figure and an axes
fig, ax = plt.subplots(figsize=(10, 6))
## Create two clusters of points
cluster1_x = np.random.normal(0.3, 0.15, 500)
cluster1_y = np.random.normal(0.3, 0.15, 500)
cluster2_x = np.random.normal(0.7, 0.15, 500)
cluster2_y = np.random.normal(0.7, 0.15, 500)
## Combine the clusters
x = np.concatenate([cluster1_x, cluster2_x])
y = np.concatenate([cluster1_y, cluster2_y])
## Create a scatter plot with alpha=0.5
scatter = ax.scatter(x, y, s=30, c='blue', alpha=0.5)
## Add a title and labels
ax.set_title("Scatter Plot with Alpha=0.5 Showing Data Density")
ax.set_xlabel("X")
ax.set_ylabel("Y")
## Set axis limits
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
## Add a grid
ax.grid(True, linestyle='--', alpha=0.7)
## Show the plot
plt.show()
理解代码和输出
运行代码后,你应该会看到一个包含两个点簇的散点图。每个点的透明度级别为 0.5,这使你能够看到点的重叠位置。
让我们来分析一下代码的关键部分:
cluster1_x = np.random.normal(0.3, 0.15, 500)—— 生成 500 个遵循正态分布的随机 x 坐标,均值为 0.3,标准差为 0.15。cluster1_y = np.random.normal(0.3, 0.15, 500)—— 为第一个点簇生成 500 个随机 y 坐标。cluster2_x和cluster2_y—— 同样为以 (0.7, 0.7) 为中心的第二个点簇生成坐标。ax.scatter(..., alpha=0.5)—— 创建一个点的不透明度为 50% 的散点图。
在散点图中使用 alpha 的好处包括:
- 密度可视化:许多点重叠的区域看起来更暗,从而揭示数据密度。
- 减少重叠绘图:如果没有透明度,重叠的点会完全相互遮挡。
- 模式识别:透明度有助于识别数据中的点簇和模式。
注意在可视化中,点重叠较多的区域是如何显得更暗的。这是一种无需使用密度估计等额外技术就能可视化数据密度的有效方法。
使用不同 Alpha 技术创建组合可视化图表
在这最后一步中,我们将结合多种技术,创建一个更复杂的可视化图表,在一个图中同时展示统一和不同的 Alpha 值。
添加新单元格
通过点击工具栏中的“+”按钮,或者在命令模式下按“Esc”然后按“b”,在你的 Jupyter Notebook 中添加一个新单元格。
创建组合可视化图表
在新单元格中输入并运行以下代码:
import matplotlib.pyplot as plt
import numpy as np
## Set a random seed for reproducibility
np.random.seed(19680801)
## Create a figure with two subplots side by side
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
## Generate some common data
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.sin(x) * np.cos(x)
## First subplot: Fixed alpha for all lines
ax1.plot(x, y1, color='red', linewidth=2, label='sin(x)', alpha=0.7)
ax1.plot(x, y2, color='blue', linewidth=2, label='cos(x)', alpha=0.7)
ax1.plot(x, y3, color='green', linewidth=2, label='sin(x)cos(x)', alpha=0.7)
## Add title and legend to first subplot
ax1.set_title("Multiple Lines with Uniform Alpha")
ax1.set_xlabel("x")
ax1.set_ylabel("y")
ax1.legend()
ax1.grid(True, linestyle='--', alpha=0.5)
## Second subplot: Scatter plot with varying alpha based on y-value
sizes = np.abs(y3 * 100) + 10 ## Vary point sizes based on y3
colors = y3 ## Use y3 values for coloring
## Calculate varying alpha values between 0.3 and 1.0 based on absolute y3 values
alphas = 0.3 + 0.7 * (np.abs(y3) / max(np.abs(y3)))
## Create a scatter plot with varying sizes, colors, and alphas
scatter = ax2.scatter(x, y3, s=sizes, c=colors, cmap='viridis',
alpha=alphas)
## Add title and labels to second subplot
ax2.set_title("Scatter Plot with Varying Alpha Based on Y-Value")
ax2.set_xlabel("x")
ax2.set_ylabel("sin(x)cos(x)")
ax2.grid(True, linestyle='--', alpha=0.5)
## Add a colorbar to the second subplot
cbar = plt.colorbar(scatter, ax=ax2)
cbar.set_label('Value of sin(x)cos(x)')
## Adjust layout and show the plot
plt.tight_layout()
plt.show()
理解代码和输出
运行代码后,你应该会看到一个包含两个并排子图的图表:
- 左子图(统一 Alpha):展示了以相同 Alpha 值(0.7)绘制的三个三角函数。
- 右子图(不同 Alpha):展示了一个散点图,其中:
- x 坐标是输入值
- y 坐标是 sin(x)cos(x)
- 每个点的大小根据 y 值的绝对值而变化
- 每个点的颜色根据 y 值而变化
- 每个点的 Alpha(透明度)根据 y 值的绝对值而变化
让我们分析一下代码的关键部分:
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))—— 创建一个包含两个并排子图的图表。- 对于第一个子图:
ax1.plot(..., alpha=0.7)—— 对所有三条线使用统一的 Alpha 值。
- 对于第二个子图:
alphas = 0.3 + 0.7 * (np.abs(y3) / max(np.abs(y3)))—— 计算介于 0.3 和 1.0 之间的不同 Alpha 值。ax2.scatter(..., alpha=alphas)—— 对散点使用不同的 Alpha 值。
这种技术组合展示了如何以各种方式使用 Alpha 值来增强可视化效果:
- 统一 Alpha 在你需要展示多个具有同等重要性的重叠元素时很有帮助。
- 不同 Alpha 在你想根据数据点的值强调某些数据点时很有用。
通过掌握这些技术,你可以创建更有效且视觉上更吸引人的数据可视化图表。
总结
在本次实验中,你学习了如何在 Matplotlib 中使用 Alpha 值(透明度)来增强数据可视化效果。让我们回顾一下所学内容:
关键概念
- Alpha 值:Alpha 值的范围从 0(完全透明)到 1(完全不透明),用于确定可视化元素的透明度。
- 设置统一 Alpha:你可以使用
alpha关键字参数为绘图中的所有元素设置相同的透明度级别。plt.plot(x, y, alpha=0.5) - 设置不同 Alpha:你可以使用
(color, alpha)元组格式为不同元素设置不同的透明度级别。colors_with_alphas = list(zip(colors, alpha_values)) plt.bar(x, y, color=colors_with_alphas)
实际应用
- 重叠元素:Alpha 值通过使重叠元素变得透明,有助于可视化这些元素。
- 数据密度:在散点图中,Alpha 值可以揭示数据密度高的区域。
- 数据强调:不同的 Alpha 值可以强调重要的数据点,同时弱化不太重要的数据点。
- 视觉层次:不同的透明度级别可以在你的绘图中创建视觉层次。
你创建的内容
- 一个使用重叠圆形展示 Alpha 值的简单示例
- 一个具有统一透明度的条形图
- 一个根据条形高度设置不同透明度的条形图
- 一个使用 Alpha 揭示数据密度的散点图
- 一个展示统一和不同 Alpha 技术的组合可视化图表
这些技术将使你能够创建更有效且视觉上更吸引人的数据可视化图表,从而更好地传达数据背后的信息。