来自 pandas 数据框的具有不同大小、标记和颜色的散点图
Scatterplot with different size, marker, and color from pandas dataframe
我正在尝试为每个点绘制速度超过米的散点图,其中标记表示不同的类型,大小表示不同的权重,颜色表示一个点超过 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'])
TypeError:您必须先 set_array 才能映射
如果你只有几个点,就像这里一样,你可以将一个浮点数列表传递给 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)
要更改标记形状,您需要添加自己的 Patch
es,或者一次添加一个点:例如
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
缩放到不同的范围以查看第 5 个点,否则其大小为 0.0)。
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,而我们使用的是标记大小的权重,所以:看不到它。
- 最简单的选择是使用
seaborn
,matplotlib
的高级 API
- 有关
palette
个选项,请参阅 Choosing color palettes。
- 测试于
python 3.8.11
、pandas 1.3.2
、matplotlib 3.4.3
、seaborn 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'
(默认)
- 这通过使用
col
和 row
参数来生成子图来提供更多程度的绘图
p = sns.relplot(data=m, x='meters', y='speed', hue='old', style='type', size='weight', palette='GnBu', height=4, aspect=1.4
我正在尝试为每个点绘制速度超过米的散点图,其中标记表示不同的类型,大小表示不同的权重,颜色表示一个点超过 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'])
TypeError:您必须先 set_array 才能映射
如果你只有几个点,就像这里一样,你可以将一个浮点数列表传递给 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)
要更改标记形状,您需要添加自己的 Patch
es,或者一次添加一个点:例如
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
缩放到不同的范围以查看第 5 个点,否则其大小为 0.0)。
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,而我们使用的是标记大小的权重,所以:看不到它。
- 最简单的选择是使用
seaborn
,matplotlib
的高级 API
- 有关
palette
个选项,请参阅 Choosing color palettes。 - 测试于
python 3.8.11
、pandas 1.3.2
、matplotlib 3.4.3
、seaborn 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'
(默认) - 这通过使用
col
和row
参数来生成子图来提供更多程度的绘图
p = sns.relplot(data=m, x='meters', y='speed', hue='old', style='type', size='weight', palette='GnBu', height=4, aspect=1.4