如何在Matplotlib中创建按密度着色的散点图
参考: How can I make a scatter plot colored by density in Matplotlib
在数据可视化过程中,散点图是一种常用的图表类型,用于展示两个变量之间的关系。有时候,我们希望能够通过散点图的颜色来表达点的密度,即在图表中某个区域点越密集的地方,颜色越深。这种按密度着色的散点图可以帮助我们更直观地理解数据的分布情况。本文将详细介绍如何使用Matplotlib库来创建按密度着色的散点图,并提供多个示例代码。
示例代码1:基础散点图
首先,我们从一个最基础的散点图开始,然后逐步添加按密度着色的功能。
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
x = np.random.randn(1000)
y = np.random.randn(1000)
# 创建散点图
plt.scatter(x, y)
plt.title('Basic Scatter Plot - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
Output:
示例代码2:计算点的密度
为了按密度着色,我们需要先计算每个点的密度。这里我们可以使用scipy.stats
中的gaussian_kde
函数来估计密度。
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
x = np.random.randn(1000)
y = np.random.randn(1000)
# 计算点的密度
xy = np.vstack([x, y])
z = gaussian_kde(xy)(xy)
# 创建散点图
plt.scatter(x, y, c=z, s=50, edgecolor='')
plt.title('Density Colored Scatter Plot - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
示例代码3:自定义颜色映射
我们可以通过自定义颜色映射(colormap)来改变散点图中点的颜色。
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
x = np.random.randn(1000)
y = np.random.randn(1000)
# 计算点的密度
xy = np.vstack([x, y])
z = gaussian_kde(xy)(xy)
# 创建散点图,使用自定义颜色映射
plt.scatter(x, y, c=z, s=50, cmap='viridis', edgecolor='')
plt.colorbar()
plt.title('Custom Colormap Scatter Plot - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
示例代码4:调整透明度
通过调整点的透明度(alpha值),可以使得密度更高的区域更加突出。
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
x = np.random.randn(1000)
y = np.random.randn(1000)
# 计算点的密度
xy = np.vstack([x, y])
z = gaussian_kde(xy)(xy)
# 创建散点图,调整透明度
plt.scatter(x, y, c=z, s=50, cmap='viridis', alpha=0.5, edgecolor='')
plt.colorbar()
plt.title('Alpha Adjusted Scatter Plot - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
示例代码5:改变点的大小
我们还可以根据密度来改变点的大小,使得密度更高的区域的点更大。
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
x = np.random.randn(1000)
y = np.random.randn(1000)
# 计算点的密度
xy = np.vstack([x, y])
z = gaussian_kde(xy)(xy)
# 创建散点图,改变点的大小
sizes = z * 1000
plt.scatter(x, y, c=z, s=sizes, cmap='viridis', alpha=0.5, edgecolor='')
plt.colorbar()
plt.title('Size Adjusted Scatter Plot - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
示例代码6:添加网格线
为了使图表更加清晰,我们可以添加网格线。
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
x = np.random.randn(1000)
y = np.random.randn(1000)
# 计算点的密度
xy = np.vstack([x, y])
z = gaussian_kde(xy)(xy)
# 创建散点图,添加网格线
plt.scatter(x, y, c=z, s=50, cmap='viridis', alpha=0.5, edgecolor='')
plt.colorbar()
plt.grid(True)
plt.title('Scatter Plot with Grid Lines - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
示例代码7:限制颜色范围
有时候我们可能需要限制颜色映射的范围,以便更好地展示数据。
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
x = np.random.randn(1000)
y = np.random.randn(1000)
# 计算点的密度
xy = np.vstack([x, y])
z = gaussian_kde(xy)(xy)
# 创建散点图,限制颜色范围
plt.scatter(x, y, c=z, s=50, cmap='viridis', alpha=0.5, edgecolor='', vmin=0, vmax=0.2)
plt.colorbar()
plt.title('Color Range Limited Scatter Plot - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
示例代码8:使用不同的颜色映射
Matplotlib提供了多种颜色映射选项,我们可以尝试不同的颜色映射来查看哪种更适合我们的数据。
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
x = np.random.randn(1000)
y = np.random.randn(1000)
# 计算点的密度
xy = np.vstack([x, y])
z = gaussian_kde(xy)(xy)
# 创建散点图,使用不同的颜色映射
plt.scatter(x, y, c=z, s=50, cmap='plasma', alpha=0.5, edgecolor='')
plt.colorbar()
plt.title('Different Colormap Scatter Plot - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
示例代码9:添加注释
在某些情况下,我们可能需要在图表中添加注释来指出特定的点或区域。
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
x = np.random.randn(1000)
y = np.random.randn(1000)
# 计算点的密度
xy = np.vstack([x, y])
z = gaussian_kde(xy)(xy)
# 创建散点图,添加注释
plt.scatter(x, y, c=z, s=50, cmap='viridis', alpha=0.5, edgecolor='')
plt.colorbar()
plt.annotate('High Density', xy=(0, 0), xytext=(1, 1),
arrowprops=dict(facecolor='black', shrink=0.05),
fontsize=12)
plt.title('Annotated Scatter Plot - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
示例代码10:保存图表为文件
最后,我们可能需要将图表保存为文件,以便于报告或演示。
from scipy.stats import gaussian_kde
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据
np.random.seed(0)
x = np.random.randn(1000)
y = np.random.randn(1000)
# 计算点的密度
xy = np.vstack([x, y])
z = gaussian_kde(xy)(xy)
# 创建散点图,保存为文件
plt.scatter(x, y, c=z, s=50, cmap='viridis', alpha=0.5, edgecolor='')
plt.colorbar()
plt.title('Scatter Plot Saved as File - how2matplotlib.com')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.savefig('density_scatter_plot.png')
plt.show()
以上是按密度着色的散点图在Matplotlib中的创建方法和一些常用的自定义选项。通过这些示例代码,你可以学习到如何计算点的密度、自定义颜色映射、调整点的大小和透明度、添加网格线和注释,以及保存图表为文件。