Matplotlib散点图:如何创建包含正负轴的散点图
参考:How to create scatterplot with both negative and positive axes
Matplotlib是Python中最流行的数据可视化库之一,它提供了强大而灵活的工具来创建各种类型的图表,包括散点图。在本文中,我们将深入探讨如何使用Matplotlib创建包含正负轴的散点图,这种图表在展示跨越原点的数据分布时特别有用。
1. Matplotlib简介
Matplotlib是一个综合性的Python绘图库,用于创建静态、动画和交互式可视化。它提供了一个类似MATLAB的接口,使得科学计算和数据分析变得更加直观和易于理解。
在开始创建散点图之前,我们需要导入必要的库:
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
print("Welcome to how2matplotlib.com")
这段代码导入了Matplotlib的pyplot模块和NumPy库,并设置了中文字体支持。
2. 基本散点图
让我们从创建一个基本的散点图开始,然后逐步添加正负轴:
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(42)
x = np.random.randn(100)
y = np.random.randn(100)
# 创建散点图
plt.figure(figsize=(8, 6))
plt.scatter(x, y, alpha=0.5)
plt.title('基本散点图 - how2matplotlib.com')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.grid(True)
plt.show()
Output:
这个例子创建了一个简单的散点图,使用随机生成的数据。plt.scatter()
函数用于绘制散点图,alpha
参数控制点的透明度。
3. 添加正负轴
要创建包含正负轴的散点图,我们需要确保坐标轴穿过原点(0, 0)。这可以通过设置坐标轴的范围和位置来实现:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(100) * 5
y = np.random.randn(100) * 5
plt.figure(figsize=(8, 6))
plt.scatter(x, y, alpha=0.5)
plt.title('包含正负轴的散点图 - how2matplotlib.com')
plt.xlabel('X轴')
plt.ylabel('Y轴')
# 设置坐标轴穿过原点
plt.axhline(y=0, color='k', linestyle='-', linewidth=0.5)
plt.axvline(x=0, color='k', linestyle='-', linewidth=0.5)
# 设置坐标轴范围
plt.xlim(-10, 10)
plt.ylim(-10, 10)
plt.grid(True)
plt.show()
Output:
在这个例子中,我们使用plt.axhline()
和plt.axvline()
函数分别添加水平和垂直线,使坐标轴穿过原点。plt.xlim()
和plt.ylim()
函数用于设置坐标轴的范围。
4. 自定义散点样式
我们可以通过调整散点的颜色、大小和形状来增强图表的可读性:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(100) * 5
y = np.random.randn(100) * 5
plt.figure(figsize=(8, 6))
plt.scatter(x, y, c=x+y, s=100, cmap='viridis', alpha=0.7, edgecolors='black')
plt.title('自定义散点样式 - how2matplotlib.com')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.axhline(y=0, color='k', linestyle='-', linewidth=0.5)
plt.axvline(x=0, color='k', linestyle='-', linewidth=0.5)
plt.xlim(-10, 10)
plt.ylim(-10, 10)
plt.colorbar(label='X+Y值')
plt.grid(True)
plt.show()
Output:
在这个例子中,我们使用c
参数来根据x+y的值设置点的颜色,s
参数设置点的大小,cmap
参数指定颜色映射,edgecolors
参数添加点的边框。我们还添加了一个颜色条来显示颜色与数值的对应关系。
5. 添加四象限标签
为了更好地区分数据点在不同象限的分布,我们可以添加象限标签:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(100) * 5
y = np.random.randn(100) * 5
fig, ax = plt.subplots(figsize=(8, 6))
scatter = ax.scatter(x, y, c=x*y, s=100, cmap='RdYlBu', alpha=0.7, edgecolors='black')
ax.set_title('四象限散点图 - how2matplotlib.com')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.axhline(y=0, color='k', linestyle='-', linewidth=0.5)
ax.axvline(x=0, color='k', linestyle='-', linewidth=0.5)
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
# 添加象限标签
ax.text(8, 8, '第一象限', ha='center', va='center')
ax.text(-8, 8, '第二象限', ha='center', va='center')
ax.text(-8, -8, '第三象限', ha='center', va='center')
ax.text(8, -8, '第四象限', ha='center', va='center')
plt.colorbar(scatter, label='X*Y值')
ax.grid(True)
plt.show()
Output:
这个例子使用ax.text()
函数在每个象限添加标签,使用ha
和va
参数来控制文本的对齐方式。
6. 使用不同的标记样式
我们可以根据数据点的特征使用不同的标记样式:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(100) * 5
y = np.random.randn(100) * 5
fig, ax = plt.subplots(figsize=(8, 6))
# 根据象限使用不同的标记
ax.scatter(x[x>0], y[x>0], marker='o', label='第一和第四象限')
ax.scatter(x[x<0], y[x<0], marker='s', label='第二和第三象限')
ax.set_title('不同标记样式的散点图 - how2matplotlib.com')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.axhline(y=0, color='k', linestyle='-', linewidth=0.5)
ax.axvline(x=0, color='k', linestyle='-', linewidth=0.5)
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
ax.legend()
ax.grid(True)
plt.show()
Output:
这个例子根据点的x坐标值使用不同的标记样式,圆形表示x为正的点,方形表示x为负的点。
7. 添加趋势线
为了更好地理解数据的趋势,我们可以添加一条趋势线:
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
np.random.seed(42)
x = np.random.randn(100) * 5
y = x + np.random.randn(100) * 2
fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(x, y, alpha=0.5)
# 添加趋势线
slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
line = slope * x + intercept
ax.plot(x, line, color='r', label=f'趋势线 (R² = {r_value**2:.2f})')
ax.set_title('带趋势线的散点图 - how2matplotlib.com')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.axhline(y=0, color='k', linestyle='-', linewidth=0.5)
ax.axvline(x=0, color='k', linestyle='-', linewidth=0.5)
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
ax.legend()
ax.grid(True)
plt.show()
Output:
这个例子使用scipy.stats.linregress()
函数计算趋势线的参数,并使用ax.plot()
函数绘制趋势线。我们还在图例中显示了R²值。
8. 添加置信椭圆
置信椭圆可以帮助我们理解数据的分布和方向:
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):
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(42)
x = np.random.randn(100) * 5
y = x + np.random.randn(100) * 2
fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(x, y, alpha=0.5)
confidence_ellipse(x, y, ax, edgecolor='red')
ax.set_title('带置信椭圆的散点图 - how2matplotlib.com')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.axhline(y=0, color='k', linestyle='-', linewidth=0.5)
ax.axvline(x=0, color='k', linestyle='-', linewidth=0.5)
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
ax.grid(True)
plt.show()
Output:
这个例子定义了一个confidence_ellipse()
函数来计算和绘制置信椭圆。椭圆的大小和方向反映了数据的分布特征。
9. 添加数据密度等高线
对于大量数据点,我们可以添加密度等高线来显示数据的分布:
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import gaussian_kde
np.random.seed(42)
x = np.random.randn(1000) * 5
y = x + np.random.randn(1000) * 2
fig, ax = plt.subplots(figsize=(8, 6))
# 计算点密度
xy = np.vstack([x,y])
z = gaussian_kde(xy)(xy)
# 绘制散点图,颜色表示密度
scatter = ax.scatter(x, y, c=z, s=50, alpha=0.5, cmap='viridis')
# 添加密度等高线
xx, yy = np.mgrid[-10:10:100j, -10:10:100j]
positions = np.vstack([xx.ravel(), yy.ravel()])
f = np.reshape(gaussian_kde(xy)(positions).T, xx.shape)
ax.contour(xx, yy, f, colors='k', linewidths=1, alpha=0.5)
ax.set_title('带密度等高线的散点图 - how2matplotlib.com')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.axhline(y=0, color='k', linestyle='-', linewidth=0.5)
ax.axvline(x=0, color='k', linestyle='-', linewidth=0.5)
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
plt.colorbar(scatter, label='点密度')
ax.grid(True)
plt.show()
Output:
这个例子使用scipy.stats.gaussian_kde()
函数计算点密度,然后使用ax.contour()
函数绘制密度等高线。散点的颜色也根据密度进行了调整。
10. 创建子图比较不同数据集
有时我们需要比较多个数据集,这时可以使用子图:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x1 = np.random.randn(100) * 5
y1 = x1 + np.random.randn(100) * 2
x2 = np.random.randn(100) * 3
y2 = -x2 + np.random.randn(100) * 1.5
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
ax1.scatter(x1, y1, alpha=0.5)
ax1.set_title('数据集1 - how2matplotlib.com')
ax1.set_xlabel('X轴')
ax1.set_ylabel('Y轴')
ax1.axhline(y=0, color='k', linestyle='-', linewidth=0.5)
ax1.axvline(x=0, color='k', linestyle='-', linewidth=0.5)
ax1.set_xlim(-10, 10)
ax1.set_ylim(-10, 10)
ax1.grid(True)
ax2.scatter(x2, y2, alpha=0.5, color='r')
ax2.set_title('数据集2 - how2matplotlib.com')
ax2.set_xlabel('X轴')
ax2.set_ylabel('Y轴')
ax2.axhline(y=0, color='k', linestyle='-', linewidth=0.5)
ax2.axvline(x=0, color='k', linestyle='-', linewidth=0.5)
ax2.set_xlim(-10, 10)
ax2.set_ylim(-10, 10)
ax2.grid(True)
plt.tight_layout()
plt.show()
Output:
这个例子创建了两个子图,分别显示不同的数据集。使用plt.subplots()
函数可以轻松创建多个子图。
11. 添加误差条
在某些情况下,我们可能需要显示数据点的不确定性或误差范围:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.linspace(-5, 5, 20)
y = x**2 + np.random.randn(20) * 5
yerr = np.random.rand(20) * 2
fig, ax = plt.subplots(figsize=(8, 6))
ax.errorbar(x, y, yerr=yerr, fmt='o', capsize=5, capthick=1, ecolor='r', label='数据点')
ax.set_title('带误差条的散点图 - how2matplotlib.com')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.axhline(y=0, color='k', linestyle='-', linewidth=0.5)
ax.axvline(x=0, color='k', linestyle='-', linewidth=0.5)
ax.set_xlim(-6, 6)
ax.set_ylim(-10, 30)
ax.legend()
ax.grid(True)
plt.show()
Output:
这个例子使用ax.errorbar()
函数绘制带有误差条的散点图。yerr
参数指定了y方向的误差大小,capsize
和capthick
参数控制误差条末端横线的大小和粗细。
12. 使用不同大小的散点
我们可以根据数据的某个特征来调整散点的大小:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(100) * 5
y = np.random.randn(100) * 5
sizes = np.abs(x * y) * 20
fig, ax = plt.subplots(figsize=(8, 6))
scatter = ax.scatter(x, y, s=sizes, alpha=0.5, c=sizes, cmap='viridis')
ax.set_title('不同大小的散点图 - how2matplotlib.com')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.axhline(y=0, color='k', linestyle='-', linewidth=0.5)
ax.axvline(x=0, color='k', linestyle='-', linewidth=0.5)
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
plt.colorbar(scatter, label='点大小 (|x*y|)')
ax.grid(True)
plt.show()
Output:
在这个例子中,散点的大小由x*y
的绝对值决定。我们还使用了相同的值来设置点的颜色,并添加了一个颜色条来显示大小和颜色的对应关系。
13. 添加文本标注
有时我们需要为特定的数据点添加文本标注:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(20) * 5
y = np.random.randn(20) * 5
fig, ax = plt.subplots(figsize=(8, 6))
scatter = ax.scatter(x, y, alpha=0.5)
ax.set_title('带文本标注的散点图 - how2matplotlib.com')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.axhline(y=0, color='k', linestyle='-', linewidth=0.5)
ax.axvline(x=0, color='k', linestyle='-', linewidth=0.5)
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
# 为一些点添加文本标注
for i, (xi, yi) in enumerate(zip(x, y)):
if i % 5 == 0: # 每5个点添加一个标注
ax.annotate(f'点{i}', (xi, yi), xytext=(5, 5), textcoords='offset points')
ax.grid(True)
plt.show()
Output:
这个例子使用ax.annotate()
函数为每5个点添加一个文本标注。xytext
参数指定了文本相对于点的偏移量。
14. 使用颜色映射显示第三个变量
我们可以使用颜色来表示第三个变量的值:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(100) * 5
y = np.random.randn(100) * 5
z = np.sin(x) + np.cos(y)
fig, ax = plt.subplots(figsize=(8, 6))
scatter = ax.scatter(x, y, c=z, s=50, cmap='coolwarm', vmin=-2, vmax=2)
ax.set_title('使用颜色显示第三个变量 - how2matplotlib.com')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.axhline(y=0, color='k', linestyle='-', linewidth=0.5)
ax.axvline(x=0, color='k', linestyle='-', linewidth=0.5)
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
plt.colorbar(scatter, label='Z = sin(x) + cos(y)')
ax.grid(True)
plt.show()
Output:
这个例子使用z
值来设置散点的颜色。vmin
和vmax
参数用于控制颜色映射的范围。
15. 添加图例和自定义标记
当我们需要在同一图表中显示多个数据系列时,添加图例非常有用:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x1 = np.random.randn(50) * 3
y1 = np.random.randn(50) * 3
x2 = np.random.randn(50) * 3 + 2
y2 = np.random.randn(50) * 3 - 2
fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(x1, y1, color='blue', marker='o', label='系列1')
ax.scatter(x2, y2, color='red', marker='^', label='系列2')
ax.set_title('多系列散点图 - how2matplotlib.com')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.axhline(y=0, color='k', linestyle='-', linewidth=0.5)
ax.axvline(x=0, color='k', linestyle='-', linewidth=0.5)
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
ax.legend()
ax.grid(True)
plt.show()
Output:
这个例子展示了如何在同一图表中绘制两个不同的数据系列,并使用不同的颜色和标记来区分它们。label
参数用于设置图例中的标签。
16. 使用极坐标系
虽然我们主要讨论的是笛卡尔坐标系中的散点图,但有时使用极坐标系可能更合适:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
r = np.random.rand(100) * 5
theta = np.random.rand(100) * 2 * np.pi
fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(projection='polar'))
scatter = ax.scatter(theta, r, c=r, cmap='viridis')
ax.set_title('极坐标系散点图 - how2matplotlib.com')
plt.colorbar(scatter, label='半径')
plt.show()
Output:
这个例子使用极坐标系创建散点图。subplot_kw=dict(projection='polar')
参数用于指定使用极坐标系。
17. 添加趋势线和置信区间
为了更好地理解数据的趋势和不确定性,我们可以添加趋势线和置信区间:
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
np.random.seed(42)
x = np.random.randn(100) * 5
y = 2 * x + np.random.randn(100) * 3
fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(x, y, alpha=0.5)
# 计算趋势线
slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
line = slope * x + intercept
ax.plot(x, line, color='r', label=f'趋势线 (R² = {r_value**2:.2f})')
# 添加置信区间
def predict(x, slope, intercept):
return slope * x + intercept
pred_y = predict(x, slope, intercept)
plt.fill_between(x, pred_y - std_err * 2, pred_y + std_err * 2, color='gray', alpha=0.2, label='95% 置信区间')
ax.set_title('带趋势线和置信区间的散点图 - how2matplotlib.com')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.axhline(y=0, color='k', linestyle='-', linewidth=0.5)
ax.axvline(x=0, color='k', linestyle='-', linewidth=0.5)
ax.set_xlim(-10, 10)
ax.set_ylim(-20, 20)
ax.legend()
ax.grid(True)
plt.show()
Output:
这个例子不仅添加了趋势线,还使用plt.fill_between()
函数添加了95%的置信区间。
18. 使用边缘直方图
边缘直方图可以帮助我们更好地理解x和y变量的分布:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(1000) * 5
y = x + np.random.randn(1000) * 2
fig = plt.figure(figsize=(8, 8))
gs = fig.add_gridspec(3, 3)
ax_main = fig.add_subplot(gs[1:, :-1])
ax_right = fig.add_subplot(gs[1:, -1], sharey=ax_main)
ax_top = fig.add_subplot(gs[0, :-1], sharex=ax_main)
# 主散点图
ax_main.scatter(x, y, alpha=0.5)
ax_main.set_xlabel('X轴')
ax_main.set_ylabel('Y轴')
# 右侧直方图
ax_right.hist(y, bins=30, orientation='horizontal', alpha=0.5)
ax_right.set_xlabel('频数')
# 顶部直方图
ax_top.hist(x, bins=30, alpha=0.5)
ax_top.set_ylabel('频数')
# 设置标题
fig.suptitle('带边缘直方图的散点图 - how2matplotlib.com', y=0.95)
# 调整布局
plt.tight_layout()
plt.show()
Output:
这个例子使用gridspec
创建了一个主散点图和两个边缘直方图。边缘直方图显示了x和y变量的分布情况。
19. 使用3D散点图
对于三维数据,我们可以创建3D散点图:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(100) * 5
y = np.random.randn(100) * 5
z = np.random.randn(100) * 5
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
scatter = ax.scatter(x, y, z, c=z, cmap='viridis')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')
ax.set_title('3D散点图 - how2matplotlib.com')
plt.colorbar(scatter, label='Z值')
plt.show()
Output:
这个例子使用projection='3d'
参数创建了一个3D坐标系,然后使用ax.scatter()
函数绘制3D散点图。
20. 使用动画展示数据变化
最后,我们可以创建一个动画来展示数据随时间的变化:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation
np.random.seed(42)
fig, ax = plt.subplots(figsize=(8,6))
x = np.random.randn(100) * 5
y = np.random.randn(100) * 5
scatter = ax.scatter(x, y, alpha=0.5)
ax.set_xlim(-10, 10)
ax.set_ylim(-10, 10)
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_title('动态散点图 - how2matplotlib.com')
ax.axhline(y=0, color='k', linestyle='-', linewidth=0.5)
ax.axvline(x=0, color='k', linestyle='-', linewidth=0.5)
def update(frame):
global x, y
x += np.random.randn(100) * 0.1
y += np.random.randn(100) * 0.1
scatter.set_offsets(np.c_[x, y])
return scatter,
ani = FuncAnimation(fig, update, frames=200, interval=50, blit=True)
plt.show()
Output:
这个例子创建了一个动画,其中散点的位置在每一帧都会稍微变化。FuncAnimation
函数用于创建动画,update
函数定义了每一帧的更新逻辑。
总结
在本文中,我们深入探讨了如何使用Matplotlib创建包含正负轴的散点图,并介绍了多种高级技巧来增强散点图的表现力和信息量。我们学习了如何:
- 创建基本的散点图
- 添加正负轴
- 自定义散点样式
- 添加四象限标签
- 使用不同的标记样式
- 添加趋势线
- 添加置信椭圆
- 添加数据密度等高线
- 创建子图比较不同数据集
- 添加误差条
- 使用不同大小的散点
- 添加文本标注
- 使用颜色映射显示第三个变量
- 添加图例和自定义标记
- 使用极坐标系
- 添加趋势线和置信区间
- 使用边缘直方图
- 创建3D散点图
- 使用动画展示数据变化
这些技巧可以帮助你创建更加丰富、信息量更大的散点图,从而更好地展示和分析你的数据。记住,好的数据可视化不仅仅是展示数据,更是讲述数据背后的故事。根据你的具体需求和数据特征,选择合适的可视化方法和技巧,可以让你的数据分析更加深入和有说服力。
在实际应用中,你可能需要根据具体情况组合使用这些技巧。例如,你可能需要在一个3D散点图中添加误差条,或者在一个带有边缘直方图的散点图中使用不同的标记样式来区分不同的数据组。Matplotlib的灵活性使得这些组合成为可能。
最后,请记住,虽然这些高级技巧可以大大增强你的散点图的表现力,但最重要的是确保你的图表清晰、准确地传达了你想要表达的信息。过度使用这些技巧可能会导致图表变得复杂和难以理解。始终将你的目标受众和你想要传达的核心信息放在首位,选择最合适的可视化方法。