Matplotlib 散点图的颜色随第三个变量的变化而变化
在数据可视化中,散点图是一种常见的图表类型,用于表示两个变量之间的关系。但是,有时我们还希望通过第三个变量的变化来表示数据点的颜色,以增强数据的表现力和对比度。本文将介绍如何使用Matplotlib创建颜色随第三个变量变化的散点图。
阅读更多:Matplotlib 教程
准备数据
首先,我们需要准备一些数据来进行绘图。这里我们使用一个简单的数据集,表示一组人的身高、体重和性别。我们可以使用Pandas来创建这个数据集。
import pandas as pd
# 创建一个DataFrame,包含身高、体重和性别数据
data = {'height': [175, 168, 172, 190, 155, 160, 180, 182, 170, 175],
'weight': [70, 55, 63, 88, 45, 50, 75, 80, 65, 70],
'gender': ['M', 'F', 'F', 'M', 'F', 'F', 'M', 'M', 'F', 'M']}
df = pd.DataFrame(data)
创建标准散点图
接下来,我们将使用Matplotlib创建标准的散点图,表示身高和体重之间的关系。
import matplotlib.pyplot as plt
# 创建散点图
plt.scatter(df['height'], df['weight'])
# 添加标题和标签
plt.title('Height vs. Weight')
plt.xlabel('Height (cm)')
plt.ylabel('Weight (kg)')
# 显示图形
plt.show()
这将创建一个简单的散点图,其中每个数据点表示一个人的身高和体重。
添加颜色
现在,我们将添加第三个变量“gender”作为颜色变量。我们可以使用Pandas的“map”函数来将字符串类型的“gender”映射到数值类型的“color”。
# 创建散点图,颜色按性别变化
plt.scatter(df['height'], df['weight'], c=df['gender'].map({'M': 0, 'F': 1}))
# 添加标题和标签
plt.title('Height vs. Weight (by Gender)')
plt.xlabel('Height (cm)')
plt.ylabel('Weight (kg)')
# 显示图形
plt.show()
这将创建一个颜色随性别变化的散点图,其中男性为蓝色,女性为红色。
自定义颜色映射
上面的颜色映射只使用了两种颜色。如果我们希望使用更多的颜色表示更多的类别,我们可以自定义颜色映射。在这种情况下,我们可以使用Matplotlib的“ListedColormap”函数来指定颜色列表,并使用“BoundaryNorm”函数来指定每个类别的边界值。
import matplotlib.colors as mcolors
# 定义颜色列表和边界值
colors = ['blue', 'red', 'green']
bounds = [0, 1, 2, 3]
# 创建颜色映射
cmap = mcolors.ListedColormap(colors)
norm = mcolors.BoundaryNorm(bounds, cmap.N)
# 创建散点图,颜色按性别变化
plt.scatter(df['height'], df['weight'], c=df['gender'].map({'M': 0, 'F': 1}), cmap=cmap, norm=norm)
# 添加标题和标签
plt.title('Height vs. Weight (by Gender with Custom Colors)')
plt.xlabel('Height (cm)')
plt.ylabel('Weight (kg)')
# 创建自定义图例
handles = [plt.Rectangle((0,0),1,1, color=cmap(i)) for i in range(len(colors))]
plt.legend(handles,['Male', 'Female'], loc='lower right')
# 显示图形
plt.show()
这将创建一个颜色随性别变化的散点图,其中使用了三种颜色表示三种性别,并添加了自定义图例。
在地图上绘制点
另一个常见的场景是在地图上绘制散点图,其中第三个变量可以表示地理位置。在这里,我们将使用Basemap库绘制一个简单的地图,并在上面添加一些数据点,其颜色将随着海拔的变化而变化。
from mpl_toolkits.basemap import Basemap
import numpy as np
# 创建地图
m = Basemap(projection='mill', llcrnrlat=-90, urcrnrlat=90, llcrnrlon=-180, urcrnrlon=180, resolution='c')
m.drawcoastlines()
m.drawcountries()
# 创建数据
lats = [22.55, 30.88, 45.52, 51.51, -33.86, -37.81]
lons = [114.10, 121.55, -122.68, -0.13, 151.21, 144.96]
elevations = [100, 200, 3000, 5000, 50, 1000]
# 绘制散点图,颜色按海拔高度变化
m.scatter(lons, lats, c=elevations, cmap=plt.cm.jet, alpha=0.5)
# 添加标题
plt.title('Elevations of Cities')
# 添加颜色条
cbar = m.colorbar(location='bottom', pad="10%")
cbar.set_label('Elevation (m)')
# 显示地图
plt.show()
这将创建一个地图,其中每个点表示一个城市的经纬度和海拔高度,且颜色随着海拔高度的变化而变化。我们还添加了一个颜色条来说明颜色和海拔之间的对应关系。
总结
在本文中,我们介绍了如何使用Matplotlib创建颜色随第三个变量变化的散点图。我们使用了Pandas和Basemap库来准备数据和绘制地图,并使用Matplotlib的scatter函数来绘制散点图。我们还介绍了如何自定义颜色映射和添加图例和颜色条。希望这篇文章能帮助您更好地理解和使用散点图来可视化数据。