使用pandas数据框创建散点图,可以根据不同的大小、标记和颜色来区分。

14

我想制作一个散点图,用不同的标记表示不同类型的点,用不同的大小表示不同的重量,用颜色表示每个点在10分钟内的年龄。然而,到目前为止我只能按照大小来制作图表。

非常感谢任何帮助。

x = {'speed': [10, 15, 20, 18, 19], 'meters' : [122, 150, 190, 230, 300], 'type': ['phone', 'phone', 'gps', 'gps', 'car'], 'weight': [0.2, 0.3, 0.1, 0.85, 0.0], 'old': [1, 2, 4, 5, 8]}

m = pd.DataFrame(x)

plt.scatter(m.meters, m.speed, s = 30* m.weight)

mkr_dict = {'gps': 'x', 'phone': '+', 'car': 'o'}

   meters  speed   type  weight  old
0     122     10  phone    0.20    1
1     150     15  phone    0.30    2
2     190     20    gps    0.10    4
3     230     18    gps    0.85    5
4     300     19    car    0.00    8

问题更新:

我尝试根据旧的颜色比例尺添加色条。当我针对整个数据集绘图时,它能够工作,但在尝试为每个子集添加标记后失败了。有什么想法吗?

plt.scatter(m.meters, m.speed, s = 30* m.weight, c=m.old)
cbar = plt.colorbar(ticks = [0, 5, 10])
cbar.ax.set_yticklabels(['New','5mins', '10mins'])

类型错误:必须先为可映射对象设置数组

3个回答

25

scatter每次只能画一种标记,因此您必须将不同类型的标记分开绘制。幸运的是,pandas使这变得容易:

scatter只能做一种标记,所以您必须单独绘制不同类型。 幸运的是,pandas使这很容易:

import matplotlib.pyplot as plt
import pandas as pd
x = {'speed': [10, 15, 20, 18, 19],
     'meters' : [122, 150, 190, 230, 300],
     'type': ['phone', 'phone', 'gps', 'gps', 'car'],
     'weight': [0.2, 0.3, 0.1, 0.85, 0.0],
     'old': [1, 2, 4, 5, 8]}

m = pd.DataFrame(x)
mkr_dict = {'gps': 'x', 'phone': '+', 'car': 'o'}
for kind in mkr_dict:
    d = m[m.type==kind]
    plt.scatter(d.meters, d.speed, 
                s = 100* d.weight, 
                c = d.old, 
                marker = mkr_dict[kind])
plt.show()

在这里输入图片描述

...... 车在哪里?好吧,在原始测试数据中,重量为0.0,而我们正在使用重量作为标记大小,所以:看不到它。


8

如果您只有一些点,可以将浮点数列表传递给 C 参数:

colors = ['r', 'b', 'k', 'g', 'm']
plt.scatter(m.meters, m.speed, s=30*m.weight, vmin=0, vmax=10, cmap=cm)

按照给定的顺序对您的点进行着色。或者,使用颜色映射:

cm = plt.cm.get_cmap('hot')  # or your colormap of choice
plt.scatter(m.meters, m.speed, s=30*m.weight, c=m.old, cmap=cm)

要更改标记形状,您需要添加自己的Patches,或一次添加一个点:例如。

markers = ['^', 'o', 'v', 's', 'd']
for px, py, c, s, t in zip(m.meters, m.speed, m.old, m.weight, markers):
    plt.scatter(px, py, marker=t, c=cm(c/10.), vmin=0, vmax=10, s=400*s+100)
plt.show()

在这里输入图片描述

我把m.weight的范围缩小了,以便看到第五个点,否则它的大小将为0.0。


3
  • 最简单的选项是使用seaborn,这是一个基于matplotlib的高级API。
  • 有关palette选项,请参见选择调色板
  • python 3.8.11pandas 1.3.2matplotlib 3.4.3seaborn 0.11.2中测试通过。

坐标轴层面绘图

import seaborn as sns
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(6, 4))

p = sns.scatterplot(data=m, x='meters', y='speed', hue='old', style='type', size='weight', palette='GnBu', ax=ax)
sns.move_legend(p, bbox_to_anchor=(1, 1.02), loc='upper left')

图形级别的绘图

  • 使用sns.relplot,并设置kind='scatter'(默认)
  • 通过使用colrow参数来创建子图,提供了更多的绘图度数。

在此输入图片描述

p = sns.relplot(data=m, x='meters', y='speed', hue='old', style='type', size='weight', palette='GnBu', height=4, aspect=1.4

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接