我有一个数据框,其中一列具有坐标,而另一列具有方向:
我试图散布坐标,然后按其方向为它们着色:
for row in df.itertuples():
x, y = row.coords[:,1], row.coords[:,0]
plt.scatter(x,y, c=df.orientation)
这将坐标绘制得很好,但方向却不正确,因为它仍在itertuple循环中。有人知道如何解决这个问题吗?
答案 0 :(得分:1)
由于每一行只有一种颜色,因此您需要为该行显式设置该颜色。为了从某个数字方向值获取颜色,您需要创建一个颜色图和一个范数。 colormap可以是您选择的任何一个。需要使用“方向”列的完整范围来设置规范。 使用范数(获取0到1之间的值),可以索引颜色图并获取rgb值。
由于plt.scatter
试图验证您是同时对所有点提供一种颜色还是对每个点提供一种颜色,因此rgb值会引起混淆。因此,最安全的方法是围绕颜色值创建一个数组(因此c=[cmap(norm(row.orientation))]
而不是c=cmap(norm(row.orientation))
)。
颜色图和规范也可以用于创建随附的颜色栏。
以下是一些示例代码,可以帮助您入门:
from matplotlib import pyplot as plt
from matplotlib.cm import ScalarMappable
import numpy as np
import pandas as pd
N = 30
df = pd.DataFrame({'coords': [np.random.normal(0, 1, size=(np.random.randint(5, 50), 2)) + np.random.uniform(0, 50, 2)
for _ in range(N)],
'orientation': np.random.uniform(-1, 1, N)})
cmap = plt.get_cmap('magma')
norm = plt.Normalize(df.orientation.min(), df.orientation.max())
for row in df.itertuples():
coords = np.array(row.coords)
x, y = coords[:, 1], coords[:, 0]
plt.scatter(x, y, c=[cmap(norm(row.orientation))])
plt.colorbar(ScalarMappable(cmap=cmap, norm=norm), label='orientation')
plt.show()
答案 1 :(得分:0)
您逐行进行迭代,因此您应该使用与x和y相同的语法:c=row.orientation