Python 在子地块上共享颜色和标签

Python 在子地块上共享颜色和标签,python,matplotlib,colors,label,Python,Matplotlib,Colors,Label,我正在尝试创建共享相同点的相同颜色和标签的子图。下面我有一个小例子。 每个点都有一个作为整数的标签和一个方向字符串,我用它来标记和过滤。为了显示正确的标签而不为每个标签创建一个散点,我使用图例中的(句柄,标签)选项。(在我的数据中有三个以上的方向) 我的问题是,下面的代码显示了过滤数据的错误标签,以及另一种颜色。我怎么能 得到相同的颜色和颜色 每个过滤点的标签是否与第一个绘图中的相同 我得到matplotlib提供了一个不同句柄的列表,如果只有2个句柄,则使用方向列表的前2个条目。我只是不知

我正在尝试创建共享相同点的相同颜色和标签的子图。下面我有一个小例子。 每个点都有一个作为整数的标签和一个方向字符串,我用它来标记和过滤。为了显示正确的标签而不为每个标签创建一个散点,我使用图例中的(句柄,标签)选项。(在我的数据中有三个以上的方向)

我的问题是,下面的代码显示了过滤数据的错误标签,以及另一种颜色。我怎么能

  • 得到相同的颜色和颜色
  • 每个过滤点的标签是否与第一个绘图中的相同
我得到matplotlib提供了一个不同句柄的列表,如果只有2个句柄,则使用方向列表的前2个条目。我只是不知道是否有办法使用标签int来获得正确的方向。 代码的绘图如下:

这是我在这里的第一个问题,如果有一些错误,很抱歉

import numpy as np
import matplotlib.pyplot as plt

X = np.arange(0, 12)
Y = X
labels = np.array([x % 3 for x in X])
directions = ['left', 'right', 'up']*4

right_only = np.array([True if direc in ['right', 'up'] else False for direc in directions])

fig, (ax1, ax2) = plt.subplots(ncols=2, nrows=1, sharey='all', sharex='all')

scatter = ax1.scatter(X, Y, c=labels)
ax1.legend(handles=scatter.legend_elements()[0], labels=directions)

scatter2 = ax2.scatter(X[right_only], Y[right_only], c=labels[right_only])
ax2.legend(handles=scatter2.legend_elements()[0], labels=directions)

要将右图上分散点的颜色更正为与左图一致,可以使用“vmin=…,vmax=…”并将它们设置为标签数组上的最小值和最大值。这将使它们之间的cmap范围保持不变

对于两个图之间的相同标签,您需要删除不属于“right_only”一部分的索引。对我有效的方法是使用“np.delete(directions,~right_only)”,它从“directions”列表中删除“right_only”的错误索引

以下是我所做的:

import numpy as np
import matplotlib.pyplot as plt

X = np.arange(0, 12)
Y = X
labels = np.array([x % 3 for x in X])
directions = ['left', 'right', 'up']*4

right_only = np.array([True if direc in ['right', 'up'] else False for direc in directions])

fig, (ax1, ax2) = plt.subplots(ncols=2, nrows=1, sharey='all', sharex='all')

scatter = ax1.scatter(X, Y, c=labels)
ax1.legend(handles=scatter.legend_elements()[0], labels=directions)

scatter2 = ax2.scatter(X[right_only], Y[right_only], c=labels[right_only], vmin=np.min(labels), vmax=np.max(labels))
ax2.legend(handles=scatter2.legend_elements()[0], labels=list(np.delete(directions, ~right_only)))

您可以将
vmin=0,vmax=2
添加到对
scatter()
的两个调用中。这样,0、1和2将始终映射到相同的颜色。谢谢,这正是我想要的!我不知道vmin和vmax。顺便说一句,我不得不为我的其他代码调整解决方案。如果您碰巧只有一个唯一方向的数组,而不是每个值的方向,那么这样做是有效的:
labels=list(np.delete(directions,~np.unique(labels[right_only]))
也许这会帮助遇到相同问题的人。