如何在Matplotlib中创建按密度着色的散点图
参考: How can I make a scatter plot colored by density in Matplotlib
在数据可视化中,散点图是一种常用的图表类型,用于展示两个变量之间的关系。有时候,我们希望通过散点图的颜色来表示数据点的密度,即在图表的某个区域内数据点的集中程度。Matplotlib是Python中一个非常流行的绘图库,它提供了丰富的功能来创建各种图表,包括按密度着色的散点图。本文将详细介绍如何在Matplotlib中创建按密度着色的散点图,并提供多个示例代码。
基础散点图
首先,我们从最基础的散点图开始,了解如何使用Matplotlib绘制散点图。
示例代码1:基础散点图
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
x = np.random.randn(100)
y = np.random.randn(100)
# 绘制散点图
plt.scatter(x, y)
plt.title('Basic Scatter Plot - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
计算密度
为了按密度着色散点图,我们需要先计算每个数据点的密度。这可以通过统计每个点周围的邻近点数量来实现。
示例代码2:计算密度
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
x = np.random.randn(100)
y = np.random.randn(100)
# 使用高斯核密度估计计算密度
xy = np.vstack([x, y])
z = gaussian_kde(xy)(xy)
# 绘制散点图
plt.scatter(x, y, c=z, s=100, cmap='viridis')
plt.title('Scatter Plot Colored by Density - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
自定义颜色映射
在Matplotlib中,我们可以自定义颜色映射(colormap),以便更好地表示数据点的密度。
示例代码3:自定义颜色映射
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
x = np.random.randn(100)
y = np.random.randn(100)
# 使用高斯核密度估计计算密度
xy = np.vstack([x, y])
z = gaussian_kde(xy)(xy)
# 绘制散点图,使用自定义颜色映射
plt.scatter(x, y, c=z, s=100, cmap='coolwarm')
plt.title('Scatter Plot with Custom Colormap - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
调整点的大小
我们还可以根据密度调整每个点的大小,以便更直观地显示密度信息。
示例代码4:调整点的大小
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
x = np.random.randn(100)
y = np.random.randn(100)
# 使用高斯核密度估计计算密度
xy = np.vstack([x, y])
z = gaussian_kde(xy)(xy)
# 根据密度调整点的大小
sizes = z * 1000
plt.scatter(x, y, c=z, s=sizes, cmap='plasma')
plt.title('Scatter Plot with Size by Density - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
添加颜色条
为了让观众更好地理解颜色与密度之间的关系,我们可以在散点图旁边添加一个颜色条。
示例代码5:添加颜色条
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
x = np.random.randn(100)
y = np.random.randn(100)
# 使用高斯核密度估计计算密度
xy = np.vstack([x, y])
z = gaussian_kde(xy)(xy)
scatter = plt.scatter(x, y, c=z, s=100, cmap='magma')
plt.colorbar(scatter)
plt.title('Scatter Plot with Colorbar - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
使用不同的标记形状
Matplotlib允许我们使用不同的标记形状来绘制散点图,以提供更多的视觉信息。
示例代码6:使用不同的标记形状
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
x = np.random.randn(100)
y = np.random.randn(100)
# 使用高斯核密度估计计算密度
xy = np.vstack([x, y])
z = gaussian_kde(xy)(xy)
plt.scatter(x, y, c=z, s=100, cmap='viridis', marker='^')
plt.title('Scatter Plot with Different Marker Shape - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
绘制透明度变化的散点图
通过调整散点图中点的透明度,我们可以更好地展示数据点的重叠情况。
示例代码7:绘制透明度变化的散点图
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
x = np.random.randn(100)
y = np.random.randn(100)
# 使用高斯核密度估计计算密度
xy = np.vstack([x, y])
z = gaussian_kde(xy)(xy)
plt.scatter(x, y, c=z, s=100, cmap='viridis', alpha=0.5)
plt.title('Scatter Plot with Varying Opacity - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
添加注释
在散点图中添加注释可以帮助观众更好地理解图表中的特定点。
示例代码8:添加注释
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
x = np.random.randn(100)
y = np.random.randn(100)
# 使用高斯核密度估计计算密度
xy = np.vstack([x, y])
z = gaussian_kde(xy)(xy)
plt.scatter(x, y, c=z, s=100, cmap='viridis')
plt.annotate('High Density', xy=(0, 0), xytext=(1, 1),
arrowprops=dict(facecolor='black', shrink=0.05),
fontsize=12)
plt.title('Scatter Plot with Annotation - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
使用子图展示不同参数的效果
我们可以使用子图来并排展示不同参数下的散点图,以便进行比较。
示例代码9:使用子图展示不同参数的效果
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
x = np.random.randn(100)
y = np.random.randn(100)
# 使用高斯核密度估计计算密度
xy = np.vstack([x, y])
z = gaussian_kde(xy)(xy)
fig, axs = plt.subplots(1, 2, figsize=(10, 5))
# 第一个子图
axs[0].scatter(x, y, c=z, s=100, cmap='viridis')
axs[0].set_title('Viridis Colormap - how2matplotlib.com')
# 第二个子图
axs[1].scatter(x, y, c=z, s=100, cmap='plasma')
axs[1].set_title('Plasma Colormap - how2matplotlib.com')
for ax in axs:
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
plt.show()
Output:
保存图表为文件
最后,我们可以将绘制好的散点图保存为图像文件,以便于分享或进一步使用。
示例代码10:保存图表为文件
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
x = np.random.randn(100)
y = np.random.randn(100)
# 使用高斯核密度估计计算密度
xy = np.vstack([x, y])
z = gaussian_kde(xy)(xy)
plt.scatter(x, y, c=z, s=100, cmap='viridis')
plt.title('Scatter Plot Saved as File - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.savefig('scatter_plot.png')
plt.show()
Output:
以上就是在Matplotlib中创建按密度着色的散点图的详细介绍和示例代码。通过这些示例代码,你可以学会如何使用Matplotlib的各种功能来创建美观且信息丰富的散点图。记得在实际应用中根据你的数据和需求调整代码中的参数。