Matplotlib散点图标签:如何优雅地为散点图添加标注
Matplotlib是Python中最流行的数据可视化库之一,它提供了丰富的绘图功能,其中散点图(scatter plot)是一种常用的图表类型。在数据分析和科学研究中,我们经常需要为散点图添加标签,以便更好地解释和展示数据。本文将深入探讨如何使用Matplotlib为散点图添加各种类型的标签,包括点标签、图例标签、轴标签等,以及如何自定义这些标签的样式和位置。
1. Matplotlib散点图基础
在开始为散点图添加标签之前,我们先来回顾一下如何使用Matplotlib创建基本的散点图。散点图通常用于展示两个变量之间的关系,每个点代表一个数据样本。
以下是一个简单的散点图示例:
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
x = np.random.rand(50)
y = np.random.rand(50)
# 创建散点图
plt.figure(figsize=(8, 6))
plt.scatter(x, y)
plt.title('Basic Scatter Plot - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
在这个例子中,我们使用numpy
生成了50个随机数据点,然后使用plt.scatter()
函数创建散点图。plt.title()
、plt.xlabel()
和plt.ylabel()
函数用于添加图表标题和轴标签。
2. 为散点图添加点标签
有时候,我们需要为散点图中的每个点添加标签,以提供更多信息。这可以通过plt.annotate()
函数实现。
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 1, 3, 5])
labels = ['A', 'B', 'C', 'D', 'E']
# 创建散点图并添加点标签
plt.figure(figsize=(8, 6))
plt.scatter(x, y)
for i, label in enumerate(labels):
plt.annotate(label, (x[i], y[i]), xytext=(5, 5), textcoords='offset points')
plt.title('Scatter Plot with Point Labels - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
在这个例子中,我们使用plt.annotate()
函数为每个点添加标签。xytext
参数指定标签相对于点的偏移量,textcoords='offset points'
表示偏移量以点为单位。
3. 自定义点标签样式
我们可以通过设置plt.annotate()
的各种参数来自定义点标签的样式,包括字体、颜色、大小等。
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 1, 3, 5])
labels = ['A', 'B', 'C', 'D', 'E']
# 创建散点图并添加自定义样式的点标签
plt.figure(figsize=(8, 6))
plt.scatter(x, y)
for i, label in enumerate(labels):
plt.annotate(label, (x[i], y[i]),
xytext=(10, 10),
textcoords='offset points',
fontsize=12,
fontweight='bold',
color='red',
bbox=dict(boxstyle='round,pad=0.5', fc='yellow', ec='k', alpha=0.7))
plt.title('Scatter Plot with Custom Point Labels - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
在这个例子中,我们设置了标签的字体大小、粗细、颜色,并添加了一个带有圆角和背景色的边框。
4. 添加图例标签
当散点图包含多个数据系列时,添加图例标签可以帮助区分不同的数据组。
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
x1 = np.random.rand(20)
y1 = np.random.rand(20)
x2 = np.random.rand(20)
y2 = np.random.rand(20)
# 创建散点图并添加图例标签
plt.figure(figsize=(8, 6))
plt.scatter(x1, y1, c='red', label='Group A')
plt.scatter(x2, y2, c='blue', label='Group B')
plt.title('Scatter Plot with Legend - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.show()
Output:
在这个例子中,我们使用label
参数为每个散点系列指定标签,然后调用plt.legend()
函数显示图例。
5. 自定义图例样式和位置
我们可以通过设置plt.legend()
的参数来自定义图例的样式和位置。
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
x1 = np.random.rand(20)
y1 = np.random.rand(20)
x2 = np.random.rand(20)
y2 = np.random.rand(20)
# 创建散点图并添加自定义样式的图例
plt.figure(figsize=(8, 6))
plt.scatter(x1, y1, c='red', label='Group A')
plt.scatter(x2, y2, c='blue', label='Group B')
plt.title('Scatter Plot with Custom Legend - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend(loc='upper left',
fontsize=12,
frameon=True,
facecolor='lightgray',
edgecolor='black',
title='Data Groups',
title_fontsize=14)
plt.show()
Output:
在这个例子中,我们自定义了图例的位置、字体大小、边框、背景色,并添加了图例标题。
6. 为散点图添加颜色标签
有时我们需要使用颜色来表示数据点的某个属性。这可以通过设置散点图的颜色映射(colormap)来实现。
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
x = np.random.rand(50)
y = np.random.rand(50)
colors = np.random.rand(50)
# 创建带有颜色标签的散点图
plt.figure(figsize=(8, 6))
scatter = plt.scatter(x, y, c=colors, cmap='viridis')
plt.title('Scatter Plot with Color Labels - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.colorbar(scatter, label='Color Value')
plt.show()
Output:
在这个例子中,我们使用c
参数指定每个点的颜色值,cmap
参数设置颜色映射。plt.colorbar()
函数添加了一个颜色条,显示颜色值的范围。
7. 添加文本标签到散点图
除了为每个点添加标签,我们还可以在图表的任意位置添加文本标签。
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
x = np.random.rand(30)
y = np.random.rand(30)
# 创建散点图并添加文本标签
plt.figure(figsize=(8, 6))
plt.scatter(x, y)
plt.text(0.5, 0.9, 'Important Region', fontsize=12, ha='center', va='center',
bbox=dict(boxstyle='round', facecolor='white', edgecolor='red'))
plt.title('Scatter Plot with Text Label - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
在这个例子中,我们使用plt.text()
函数在图表的指定位置添加了一个文本标签。
8. 为散点图添加箭头标注
有时我们需要使用箭头来指向散点图中的特定区域或点。这可以通过plt.annotate()
函数的arrowprops
参数实现。
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
x = np.random.rand(30)
y = np.random.rand(30)
# 创建散点图并添加箭头标注
plt.figure(figsize=(8, 6))
plt.scatter(x, y)
plt.annotate('Interesting Point', xy=(0.5, 0.5), xytext=(0.7, 0.7),
arrowprops=dict(facecolor='black', shrink=0.05),
fontsize=12)
plt.title('Scatter Plot with Arrow Annotation - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
在这个例子中,我们使用plt.annotate()
函数添加了一个带箭头的标注,指向散点图中的一个特定位置。
9. 为散点图添加多行标签
有时我们需要为散点图添加包含多行文本的标签。这可以通过在标签文本中使用换行符\n
来实现。
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
x = np.random.rand(30)
y = np.random.rand(30)
# 创建散点图并添加多行标签
plt.figure(figsize=(8, 6))
plt.scatter(x, y)
plt.annotate('Multi-line\nAnnotation\nExample', xy=(0.5, 0.5), xytext=(0.7, 0.7),
arrowprops=dict(facecolor='black', shrink=0.05),
fontsize=12, ha='center', va='center')
plt.title('Scatter Plot with Multi-line Annotation - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
在这个例子中,我们使用\n
在标签文本中添加了换行,创建了一个多行标签。
10. 为散点图添加数学公式标签
Matplotlib支持使用LaTeX语法在图表中添加数学公式。这对于科学和工程应用特别有用。
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)
# 创建散点图并添加数学公式标签
plt.figure(figsize=(8, 6))
plt.scatter(x, y)
plt.annotate(r'y = \sin(x)', xy=(np.pi, 0), xytext=(np.pi+0.5, 0.5),
arrowprops=dict(facecolor='black', shrink=0.05),
fontsize=14)
plt.title('Scatter Plot with Math Formula Label - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
在这个例子中,我们使用LaTeX语法$y = \sin(x)$
添加了一个数学公式标签。注意使用原始字符串r''
来避免反斜杠被解释为转义字符。
11. 为散点图添加自定义标记
除了使用默认的圆点标记,我们还可以为散点图使用自定义的标记样式。
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
x = np.random.rand(50)
y = np.random.rand(50)
# 创建带有自定义标记的散点图
plt.figure(figsize=(8, 6))
plt.scatter(x, y, marker='*', s=100, c='red', label='Star Marker')
plt.scatter(x+0.1, y+0.1, marker='^', s=100, c='blue', label='Triangle Marker')
plt.title('Scatter Plot with Custom Markers - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.show()
Output:
在这个例子中,我们使用marker
参数指定了星形和三角形标记。s
参数用于设置标记的大小。
12. 为散点图添加误差条
在某些情况下,我们需要在散点图上显示数据点的误差范围。这可以通过添加误差条来实现。
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
x = np.linspace(0, 10, 10)
y = np.random.rand(10)
yerr = np.random.rand(10) * 0.1
# 创建带有误差条的散点图
plt.figure(figsize=(8, 6))
plt.errorbar(x, y, yerr=yerr, fmt='o', capsize=5, capthick=2, label='Data with Error')
plt.title('Scatter Plot with Error Bars - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.show()
Output:
在这个例子中,我们使用plt.errorbar()
函数创建了带有误差条的散点图。yerr
参数指定了Y轴方向的误差值,capsize
和capthick
参数用于设置误差条端点的样式。
13. 为散点图添加趋势线
有时我们需要在散点图上添加趋势线来显示数据的整体趋势。
import matplotlib```python
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
x = np.linspace(0, 10, 50)
y = 2 * x + 1 + np.random.randn(50)
# 创建散点图并添加趋势线
plt.figure(figsize=(8, 6))
plt.scatter(x, y, label='Data Points')
# 计算趋势线
z = np.polyfit(x, y, 1)
p = np.poly1d(z)
plt.plot(x, p(x), "r--", label='Trend Line')
plt.title('Scatter Plot with Trend Line - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
plt.show()
在这个例子中,我们使用np.polyfit()
和np.poly1d()
函数计算并绘制了一条线性趋势线。
14. 为散点图添加置信椭圆
在某些统计分析中,我们可能需要在散点图上添加置信椭圆来表示数据的分布范围。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Ellipse
import matplotlib.transforms as transforms
def confidence_ellipse(x, y, ax, n_std=3.0, facecolor='none', **kwargs):
"""
Create a plot of the covariance confidence ellipse of *x* and *y*.
"""
if x.size != y.size:
raise ValueError("x and y must be the same size")
cov = np.cov(x, y)
pearson = cov[0, 1]/np.sqrt(cov[0, 0] * cov[1, 1])
ell_radius_x = np.sqrt(1 + pearson)
ell_radius_y = np.sqrt(1 - pearson)
ellipse = Ellipse((0, 0), width=ell_radius_x * 2, height=ell_radius_y * 2,
facecolor=facecolor, **kwargs)
scale_x = np.sqrt(cov[0, 0]) * n_std
mean_x = np.mean(x)
scale_y = np.sqrt(cov[1, 1]) * n_std
mean_y = np.mean(y)
transf = transforms.Affine2D() \
.rotate_deg(45) \
.scale(scale_x, scale_y) \
.translate(mean_x, mean_y)
ellipse.set_transform(transf + ax.transData)
return ax.add_patch(ellipse)
# 生成示例数据
np.random.seed(0)
x = np.random.normal(0, 1, 100)
y = np.random.normal(0, 1, 100)
# 创建散点图并添加置信椭圆
fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(x, y, s=5)
confidence_ellipse(x, y, ax, n_std=1, label='1σ', edgecolor='red')
confidence_ellipse(x, y, ax, n_std=2, label='2σ', edgecolor='green')
confidence_ellipse(x, y, ax, n_std=3, label='3σ', edgecolor='blue')
ax.set_title('Scatter Plot with Confidence Ellipses - how2matplotlib.com')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.legend()
plt.show()
Output:
在这个例子中,我们定义了一个confidence_ellipse()
函数来计算和绘制置信椭圆,然后在散点图上添加了1σ、2σ和3σ的置信椭圆。
15. 为散点图添加密度等高线
当数据点非常密集时,我们可以添加密度等高线来更好地展示数据分布。
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import gaussian_kde
# 生成示例数据
np.random.seed(0)
x = np.random.normal(0, 1, 1000)
y = np.random.normal(0, 1, 1000)
# 计算密度
xy = np.vstack([x,y])
z = gaussian_kde(xy)(xy)
# 创建散点图并添加密度等高线
fig, ax = plt.subplots(figsize=(8, 6))
scatter = ax.scatter(x, y, c=z, s=50, edgecolor='', cmap='viridis')
plt.colorbar(scatter, label='Density')
# 添加等高线
xi, yi = np.mgrid[x.min():x.max():100j, y.min():y.max():100j]
zi = gaussian_kde(xy)(np.vstack([xi.flatten(), yi.flatten()]))
ax.contour(xi, yi, zi.reshape(xi.shape), levels=5, colors='k', linewidths=0.5)
ax.set_title('Scatter Plot with Density Contours - how2matplotlib.com')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
plt.show()
在这个例子中,我们使用scipy.stats.gaussian_kde
计算数据点的密度,然后使用plt.contour()
函数添加密度等高线。
16. 为散点图添加子图标签
当我们需要在一个图形中展示多个相关的散点图时,添加子图标签可以帮助区分不同的子图。
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
np.random.seed(0)
data1 = np.random.randn(100, 2)
data2 = np.random.randn(100, 2) + np.array([2, 2])
data3 = np.random.randn(100, 2) + np.array([-2, 2])
data4 = np.random.randn(100, 2) + np.array([2, -2])
# 创建2x2的子图布局
fig, axs = plt.subplots(2, 2, figsize=(12, 12))
fig.suptitle('Multiple Scatter Plots with Subplot Labels - how2matplotlib.com', fontsize=16)
# 绘制散点图并添加子图标签
axs[0, 0].scatter(data1[:, 0], data1[:, 1])
axs[0, 0].set_title('Subplot A')
axs[0, 1].scatter(data2[:, 0], data2[:, 1])
axs[0, 1].set_title('Subplot B')
axs[1, 0].scatter(data3[:, 0], data3[:, 1])
axs[1, 0].set_title('Subplot C')
axs[1, 1].scatter(data4[:, 0], data4[:, 1])
axs[1, 1].set_title('Subplot D')
# 调整子图之间的间距
plt.tight_layout()
plt.show()
Output:
在这个例子中,我们创建了一个2×2的子图布局,每个子图包含一个散点图,并使用set_title()
函数为每个子图添加了标签。
17. 为散点图添加动态标签
在某些情况下,我们可能希望只在鼠标悬停在数据点上时显示标签。这可以通过使用Matplotlib的事件处理功能来实现。
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
np.random.seed(0)
x = np.random.rand(20)
y = np.random.rand(20)
labels = [f'Point {i+1}' for i in range(20)]
# 创建散点图
fig, ax = plt.subplots(figsize=(8, 6))
scatter = ax.scatter(x, y)
# 创建注释对象(初始时不可见)
annot = ax.annotate("", xy=(0,0), xytext=(20,20),textcoords="offset points",
bbox=dict(boxstyle="round", fc="w"),
arrowprops=dict(arrowstyle="->"))
annot.set_visible(False)
def update_annot(ind):
pos = scatter.get_offsets()[ind["ind"][0]]
annot.xy = pos
text = f"{labels[ind['ind'][0]]}\n({pos[0]:.2f}, {pos[1]:.2f})"
annot.set_text(text)
annot.get_bbox_patch().set_alpha(0.4)
def hover(event):
vis = annot.get_visible()
if event.inaxes == ax:
cont, ind = scatter.contains(event)
if cont:
update_annot(ind)
annot.set_visible(True)
fig.canvas.draw_idle()
else:
if vis:
annot.set_visible(False)
fig.canvas.draw_idle()
fig.canvas.mpl_connect("motion_notify_event", hover)
plt.title('Scatter Plot with Dynamic Labels - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
在这个例子中,我们定义了update_annot()
和hover()
函数来处理鼠标悬停事件,并在鼠标悬停在数据点上时显示标签。
18. 为散点图添加分类标签
当散点图中的数据点属于不同的类别时,我们可以使用不同的颜色和标记来区分它们,并添加相应的分类标签。
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
np.random.seed(0)
n_points = 50
x1 = np.random.rand(n_points)
y1 = np.random.rand(n_points)
x2 = np.random.rand(n_points) + 0.5
y2 = np.random.rand(n_points) + 0.5
x3 = np.random.rand(n_points) - 0.5
y3 = np.random.rand(n_points) + 0.5
# 创建散点图并添加分类标签
fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(x1, y1, c='red', marker='o', label='Category A')
ax.scatter(x2, y2, c='blue', marker='^', label='Category B')
ax.scatter(x3, y3, c='green', marker='s', label='Category C')
ax.set_title('Scatter Plot with Categorical Labels - how2matplotlib.com')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.legend()
plt.show()
Output:
在这个例子中,我们为三个不同的类别使用了不同的颜色和标记,并通过label
参数和legend()
函数添加了分类标签。
19. 为散点图添加数据标签和趋势线标签
有时我们需要在散点图上同时显示数据点的标签和趋势线的方程。
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
np.random.seed(0)
x = np.linspace(0, 10, 20)
y = 2 * x + 1 + np.random.randn(20)
labels = [f'P{i+1}' for i in range(20)]
# 创建散点图
fig, ax = plt.subplots(figsize=(10, 6))
scatter = ax.scatter(x, y)
# 添加数据标签
for i, label in enumerate(labels):
ax.annotate(label, (x[i], y[i]), xytext=(5, 5), textcoords='offset points')
# 添加趋势线
z = np.polyfit(x, y, 1)
p = np.poly1d(z)
ax.plot(x, p(x), "r--")
# 添加趋势线方程
equation = f'y = {z[0]:.2f}x + {z[1]:.2f}'
ax.text(0.05, 0.95, equation, transform=ax.transAxes, fontsize=12,
verticalalignment='top', bbox=dict(boxstyle='round', facecolor='white', alpha=0.7))
ax.set_title('Scatter Plot with Data Labels and Trend Line - how2matplotlib.com')
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
plt.tight_layout()
plt.show()
Output:
在这个例子中,我们为每个数据点添加了标签,并在图表的左上角添加了趋势线的方程。
20. 为3D散点图添加标签
Matplotlib也支持创建3D散点图,我们可以为3D散点图添加各种标签。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
# 生成示例数据
np.random.seed(0)
n = 100
x = np.random.rand(n)
y = np.random.rand(n)
z = np.random.rand(n)
colors = np.random.rand(n)
# 创建3D散点图
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
scatter = ax.scatter(x, y, z, c=colors, cmap='viridis')
# 添加颜色条
plt.colorbar(scatter, label='Color Value')
# 添加坐标轴标签
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_zlabel('Z-axis')
# 添加标题
ax.set_title('3D Scatter Plot with Labels - how2matplotlib.com')
# 添加文本标签
ax.text(0.5, 0.5, 0.5, "Center Point", color='red')
plt.show()
Output:
在这个例子中,我们创建了一个3D散点图,添加了坐标轴标签、标题、颜色条和一个文本标签。
总结:
本文详细介绍了如何使用Matplotlib为散点图添加各种类型的标签,包括点标签、图例标签、轴标签、颜色标签、文本标签、箭头标注、数学公式标签等。我们还探讨了如何自定义这些标签的样式和位置,以及如何处理特殊情况,如多行标签、动态标签和3D散点图标签。
通过这些技术,我们可以大大提高散点图的可读性和信息量,使其成为更有效的数据可视化工具。以下是一些关键点的总结:
- 基本标签:使用
plt.title()
、plt.xlabel()
和plt.ylabel()
可以轻松添加图表标题和轴标签。 -
点标签:
plt.annotate()
函数允许我们为散点图中的个别点添加标签,并可以自定义标签的样式和位置。 -
图例标签:通过在
plt.scatter()
函数中使用label
参数,并调用plt.legend()
,我们可以为不同的数据系列添加图例。 -
颜色标签:使用颜色映射和颜色条可以为散点图添加额外的维度,展示更多信息。
-
文本和箭头标注:
plt.text()
和plt.annotate()
函数可以在图表的任意位置添加文本说明和箭头指示。 -
数学公式:Matplotlib支持LaTeX语法,允许我们在图表中添加复杂的数学公式。
-
自定义标记:除了默认的圆点,我们还可以使用各种自定义标记来区分不同的数据点。
-
误差条和趋势线:这些元素可以帮助我们更好地理解数据的分布和趋势。
-
置信椭圆和密度等高线:这些高级技术可以帮助我们更深入地分析数据的统计特性。
-
子图标签:在复杂的图表中,子图标签可以帮助读者更好地理解每个部分的内容。
-
动态标签:通过事件处理,我们可以创建交互式的标签,提高用户体验。
-
3D散点图标签:Matplotlib的3D绘图功能允许我们在三维空间中添加各种标签。
在实际应用中,选择合适的标签类型和样式对于有效传达信息至关重要。我们应该根据数据的特性和目标受众的需求来决定使用哪种标签方式。同时,也要注意不要在图表中添加过多的标签,以免造成视觉混乱。
最后,值得注意的是,虽然Matplotlib提供了丰富的标签功能,但在处理大规模数据时,可能需要考虑性能问题。对于非常大的数据集,可能需要使用其他专门的大数据可视化工具。
通过掌握这些技术,我们可以创建出既美观又信息丰富的散点图,为数据分析和科学研究提供有力的可视化支持。无论是在学术论文、商业报告还是数据科学项目中,这些技能都将大有用武之地。