如何在python中可视化重叠数据?

如何在python中可视化重叠数据?,python,plot,visualization,Python,Plot,Visualization,假设我有两个列表: a=[00000011000000111100001100001] b=[00000111100000010000001100001] 有没有什么方法可以将十字路口形象化? 我的意思是创建一些绘图或图片,其中白色背景为零,[a]中的一个为红色,[b]中的一个为蓝色,其重叠部分为紫色?我的建议是创建一个包含4个值的列表: 两者中0=0,b中1=1,a中2=1,两者中3=1 您可以通过将第一个列表乘以2,然后将其添加到第二个列表来完成此操作。这将导致列表c,其值为0-3,基于1

假设我有两个列表:

a=[00000011000000111100001100001]
b=[00000111100000010000001100001]
有没有什么方法可以将十字路口形象化?
我的意思是创建一些绘图或图片,其中白色背景为零,[a]中的一个为红色,[b]中的一个为蓝色,其重叠部分为紫色?

我的建议是创建一个包含4个值的列表:

两者中0=0,b中1=1,a中2=1,两者中3=1

您可以通过将第一个列表乘以2,然后将其添加到第二个列表来完成此操作。这将导致列表c,其值为0-3,基于1在原始两个列表中的显示位置

使用matplotlib生成图表,如下所示:

import matplotlib.pyplot as plt

a = [0,1,0,1,0,0,0,0,1,0,0,0,1,1,1]
b = [0,0,1,0,0,1,1,0,0,0,1,0,1,1,0]
c = []

for i, item in enumerate(a):
    c.append(item * 2 + b[i])

x = range(0,len(a))
y = [1] * len(a)

plt.scatter(x, y, c=c, s=500)
plt.show()
您可以打印(c)以显示颜色索引的工作方式:

c=[0,2,1,2,0,1,1,0,2,0,1,0,3,2]

在本例中-蓝色:均为0,黄色:a=1,浅蓝色:b=1,红色:均为1


虽然我的解决方案与Chris的类似,但我也展示了如何定义自定义颜色,以及如何将该方法推广到多个覆盖层

对于每个位置,您将得到
a
中整数的贡献和
b
中整数的贡献。因为它们可以是0或1,所以可以使用二进制描述。通过将
b
中的整数移动到第二个位置,即乘以2,您可以表示2位的任意组合,
ba
,每个列表中的每个整数对应一位(每个位置)

Matplotlib还允许您。结合这些方面,你可以达到你想要的结果

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

a = np.array([0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1])
b = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1])

lists = [a, b]
overlap = np.zeros_like(a)

for k, row in enumerate(lists):
    overlap += row * 2**k

cmap = mpl.colors.ListedColormap(['white', 'blue', 'red', 'purple'])
bounds = range((2**len(lists))+1)
norm = mpl.colors.BoundaryNorm(bounds, cmap.N)

plt.pcolor(overlap.reshape((1, overlap.shape[0])), edgecolor='k', cmap=cmap, norm=norm)
plt.axes().set_aspect('equal')
plt.xticks([])
plt.yticks([])
plt.xlim(0, len(a))
plt.show()
输出:

如果您有3个覆盖层,则必须按以下顺序列出颜色列表:

000    white
001    colour A
010    colour B
011    colour A+B
100    colour C
101    colour A+C
110    colour B+C
111    colour A+B+C
不幸的是,这必须手动完成。您可以看到颜色名称列表。如果一种颜色没有明确的名称,你可以用字符串中的十六进制值来描述它,比如
'#RRGGBB'
,其中
RR
将是红色通道的十六进制值,等等。因此,你可以说
'.\FFFFFF'
,而不是
'white'
(字母也可以是小写)

代码注释

bounds
是数字列表
[0,1,2,3,4]
。这意味着从0到1的任何值(不包括1)都将映射为白色,从1到2的任何值映射为蓝色,等等。如果我们有
k
覆盖,我们需要
2**k+1
边界号

我选择使用
pcolor()
表示数据,因为它有
edgecolor
选项,可以更好地可视化相同颜色的运行。但是,该函数需要一个2D数组作为输入,因此我必须将
重叠的
数组从大小
(29,)
改为
(1,29)
。一般来说,即使
a
b
是二维数组,此代码也可以工作,在这种情况下,您可以跳过任何重塑


在本节中,我简要讨论了我考虑过的其他方法,但考虑到OP的范围,我发现这些方法缺乏或不必要地复杂

Alpha混合(透明度) 可以为第一个列表创建一行白色蓝色,并在其顶部堆叠另一行白色红色。理论上,白色是白色,白色是蓝色,白色是红色,蓝色是紫色。然而,由于每一行都是半透明的,红色看起来像粉红色,而蓝色加上一层层白色则被“稀释”成浅蓝色。这种效果在多层的情况下会更加明显,但至少在没有任何人工定义的情况下,颜色的组合会出现

这种方法的一个优点是,它不仅支持任何单个叠加的1或0,而且支持中间的任何渐变

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

a = np.array([0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1])
b = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1])

blue = mpl.colors.LinearSegmentedColormap.from_list('blue', ['white', 'blue'], 256)
red = mpl.colors.LinearSegmentedColormap.from_list('red', ['white', 'red'], 256)

plt.pcolor(a.reshape((1, a.shape[0])), cmap=blue, edgecolor='k', alpha=1.0)
plt.pcolor(b.reshape((1, b.shape[0])), cmap=red, edgecolor='k', alpha=0.5)
plt.axes().set_aspect('equal')
plt.xticks([])
plt.yticks([])
plt.xlim(0, len(a))
plt.show()
输出:

RGB混合
如果将叠加转换为RGB值会怎么样?例如,
a
中的每个1可以由
[0,0255]
三元组表示。通过混合每个叠加的RGB值,我们可以获得每个位置的最终RGB值,然后我们可以使用RGB颜色贴图进行绘制。但是,情况并非如此。

所以你有a==[83010353356805013505L]和b==[674459080744761589761L]?你是什么意思?[a] 和[b]是二进制字符串。不,它们是每个都包含一个整数的列表。是的,你说得对。我从csv文件中读取了它们。在决定这是浪费时间之前,我将最后一次问您,在您的程序中a和b是什么样子的。a和b是什么?整数列表,字符串列表?通心粉?非常感谢!这正是我需要的