Python 3.x matplotlib选择2色方案或3色方案

Python 3.x matplotlib选择2色方案或3色方案,python-3.x,matplotlib,Python 3.x,Matplotlib,我有一个从集合[-1,0,1]中采样的值的绘图,每个值都映射到一种颜色。但是,可以有一个样本,其中仅出现两个不同的值([-1,0]、-1,1]、[0,1]),如果出现这种情况,则颜色方案应相应调整 如果唯一值的数量为3,则此代码有效 ax2 = plt.subplot2grid((n_rows , 1), (2, 0)) colors = [(216/255, 24/255, 24/255), (1, 1, 1), (143/255, 188/255, 143/255)] positio

我有一个从集合[-1,0,1]中采样的值的绘图,每个值都映射到一种颜色。但是,可以有一个样本,其中仅出现两个不同的值([-1,0]、-1,1]、[0,1]),如果出现这种情况,则颜色方案应相应调整

如果唯一值的数量为3,则此代码有效

ax2 = plt.subplot2grid((n_rows , 1), (2, 0))
colors = [(216/255, 24/255, 24/255), (1, 1, 1), (143/255, 188/255, 143/255)]    
positions = df['long'].astype(int) - df['short'].astype(int)
cm = LinearSegmentedColormap.from_list('mycols', colors, N=3)
ax2.pcolorfast(ax2.get_xlim(), ax2.get_ylim(),  positions.values[np.newaxis], cmap=cm, alpha=0.5)    
结果是

我应该如何管理只需要两种颜色的场景

我认为这控制了分段的数量,但我不知道如何解释颜色方案

cm = LinearSegmentedColormap.from_list('colores', colors, N=len(list(set(positions))))

如果将颜色设置为numpy数组,则可以按照以下方式执行:
colors[np.isin([-1,0,1],sorted(available_values))]
选择所需的颜色。
[-1,0,1]
当然应该是所有可用值的完整列表,并与
颜色
一一对应

请注意,当值是浮点值时,这可能不起作用,因为比较有时不准确

示例代码(未测试):


如果将颜色设置为numpy数组,则可以按照以下方式执行:
colors[np.isin([-1,0,1],sorted(available_values))]
选择所需的颜色。
[-1,0,1]
当然应该是所有可用值的完整列表,并与
颜色
一一对应

请注意,当值是浮点值时,这可能不起作用,因为比较有时不准确

示例代码(未测试):


通常情况下,不会为每个具有不同值的绘图创建新的颜色贴图,而是更改规格化

据我所知,这里只有值
[-1,0,1]
或使用中的任何子集。因此,可以使用单个规范化作为
plt.Normalize(-1,1)

import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import numpy as np


colors = [(216/255., 24/255., 24/255.), (1., 1., 1.), (143/255., 188/255., 143/255.)]
cmap = ListedColormap(colors)
norm=plt.Normalize(-1,1)

combinations = [[-1,0,1],[-1,0],[0,1],[-1,1]]

fig, axes = plt.subplots(nrows=len(combinations), sharex=True)

for combo, ax in zip(combinations, axes):    
    data = np.random.choice(combo, size=(50))

    ax.pcolorfast(np.atleast_2d(data), cmap=cmap, norm=norm, alpha=0.5)
    ax.set_ylabel(combo)

plt.show()

通常不会为每个具有不同值的绘图创建新的颜色贴图,而是更改标准化

据我所知,这里只有值
[-1,0,1]
或使用中的任何子集。因此,可以使用单个规范化作为
plt.Normalize(-1,1)

import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import numpy as np


colors = [(216/255., 24/255., 24/255.), (1., 1., 1.), (143/255., 188/255., 143/255.)]
cmap = ListedColormap(colors)
norm=plt.Normalize(-1,1)

combinations = [[-1,0,1],[-1,0],[0,1],[-1,1]]

fig, axes = plt.subplots(nrows=len(combinations), sharex=True)

for combo, ax in zip(combinations, axes):    
    data = np.random.choice(combo, size=(50))

    ax.pcolorfast(np.atleast_2d(data), cmap=cmap, norm=norm, alpha=0.5)
    ax.set_ylabel(combo)

plt.show()

通常您不会创建不同的颜色映射,而是更改标准化,甚至只更改值。这里很难给出有用的答案,因为不清楚如何使用彩色贴图创建绘图。如果你想提供一个,那肯定会很有帮助。你想使用当前方案中相同的颜色,以相同的顺序吗(对于两个值来说是红白的)?@9769953对于[-1,0,1],映射应该是[red,white,green]。所以如果只有[-1,0],那么用红色和白色绘制。如果只有[-1,1],那么只绘制红色和绿色不,我的意思是两种颜色应该是什么。或者这取决于可用的值吗?@ImportanceOfBeingErnest我知道我不提供数据,因为我无法找到一种有效、完整地提供数据的方法。如果不清楚,请问我一个问题,这样我可以更明确地说,您不会创建不同的颜色映射,而是更改规范化,甚至仅更改值。这里很难给出有用的答案,因为不清楚如何使用彩色贴图创建绘图。如果你想提供一个,那肯定会很有帮助。你想使用当前方案中相同的颜色,以相同的顺序吗(对于两个值来说是红白的)?@9769953对于[-1,0,1],映射应该是[red,white,green]。所以如果只有[-1,0],那么用红色和白色绘制。如果只有[-1,1],那么只绘制红色和绿色不,我的意思是两种颜色应该是什么。或者这取决于可用的值吗?@ImportanceOfBeingErnest我知道我不提供数据,因为我无法找到一种有效、完整地提供数据的方法。如果不清楚,那么问我一个问题,这样我就可以更清楚地解释它,而且它是有效的。接受答案,因为这是第一个,但另一个更漂亮lol@Yuca这不是成为第一,或是最漂亮(除非这两个都是问题的要求),而是什么最适合你。我的答案与您自己的代码和尝试的解决方案非常接近,而另一个答案添加了一些内容,以显示事情可能会有什么不同(这对其他读者来说可能更为通用)。我知道这与此无关,但由于这两个答案对我都有效,所以剩下的唯一标准是时间顺序。但是,如果StackOverflow指南倾向于更一般的答案,那么我将更改我的标记并测试它,它会起作用。接受答案,因为这是第一个,但另一个更漂亮lol@Yuca这不是成为第一,或是最漂亮(除非这两个都是问题的要求),而是什么最适合你。我的答案与您自己的代码和尝试的解决方案非常接近,而另一个答案添加了一些内容,以显示事情可能会有什么不同(这对其他读者来说可能更为通用)。我知道这与此无关,但由于这两个答案对我都有效,所以剩下的唯一标准是时间顺序。然而,如果StackOverflow指南倾向于更一般的答案,那么我将改变我的分数