Python Matplot:如何绘制真/假或活动/非活动数据?
我想绘制一个Python Matplot:如何绘制真/假或活动/非活动数据?,python,matplotlib,plot,scipy,Python,Matplotlib,Plot,Scipy,我想绘制一个true/false或active/deactive二进制数据,类似下图: 横轴是时间,纵轴是一些活动(白色)或非活动(黑色)的实体(这里是一些传感器)。如何使用pyplot绘制这样的图形 我搜索了这些图形的名称,但找不到它。您要查找的是imshow: import matplotlib.pyplot as plt import numpy as np # get some data with true @ probability 80 % data = np.random.ra
true/false
或active/deactive
二进制数据,类似下图:
横轴是时间,纵轴是一些活动(白色)或非活动(黑色)的实体(这里是一些传感器)。如何使用pyplot
绘制这样的图形
我搜索了这些图形的名称,但找不到它。您要查找的是
imshow
:
import matplotlib.pyplot as plt
import numpy as np
# get some data with true @ probability 80 %
data = np.random.random((20, 500)) > .2
fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(data, aspect='auto', cmap=plt.cm.gray, interpolation='nearest')
然后你只需要从某处得到Y标签
你问题中的图像似乎有一些插值。让我们再做几件事:
import matplotlib.pyplot as plt
import numpy as np
# create a bit more realistic-looking data
# - looks complicated, but just has a constant switch-off and switch-on probabilities
# per column
# - the result is a 20 x 500 array of booleans
p_switchon = 0.02
p_switchoff = 0.05
data = np.empty((20,500), dtype='bool')
data[:,0] = np.random.random(20) < .2
for c in range(1, 500):
r = np.random.random(20)
data[data[:,c-1],c] = (r > p_switchoff)[data[:,c-1]]
data[-data[:,c-1],c] = (r < p_switchon)[-data[:,c-1]]
# create some labels
labels = [ "label_{0:d}".format(i) for i in range(20) ]
# this is the real plotting part
fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(data, aspect='auto', cmap=plt.cm.gray)
ax.set_yticks(np.arange(len(labels)))
ax.set_yticklabels(labels)
导入matplotlib.pyplot作为plt
将numpy作为np导入
#创建更逼真的数据
#-看起来很复杂,但只是有一个恒定的关闭和打开概率
#每列
#-结果是一个20 x 500的布尔数组
p_开关=0.02
p_关闭=0.05
data=np.empty((20500),dtype='bool')
数据[:,0]=np.random.random(20)<.2
对于范围(1500)内的c:
r=np.随机。随机(20)
数据[数据[:,c-1],c]=(r>p_关闭)[数据[:,c-1]]
数据[-data[:,c-1],c]=(r
创造
然而,插值在这里不一定是件好事。为了使不同的行更容易分开,可以使用颜色:
import matplotlib.pyplot as plt
import matplotlib.colors
import numpy as np
# create a bit more realistic-looking data
# - looks complicated, but just has a constant switch-off and switch-on probabilities
# per column
# - the result is a 20 x 500 array of booleans
p_switchon = 0.02
p_switchoff = 0.05
data = np.empty((20,500), dtype='bool')
data[:,0] = np.random.random(20) < .2
for c in range(1, 500):
r = np.random.random(20)
data[data[:,c-1],c] = (r > p_switchoff)[data[:,c-1]]
data[-data[:,c-1],c] = (r < p_switchon)[-data[:,c-1]]
# create some labels
labels = [ "label_{0:d}".format(i) for i in range(20) ]
# create a color map with random colors
colmap = matplotlib.colors.ListedColormap(np.random.random((21,3)))
colmap.colors[0] = [0,0,0]
# create some colorful data:
data_color = (1 + np.arange(data.shape[0]))[:, None] * data
# this is the real plotting part
fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(data_color, aspect='auto', cmap=colmap, interpolation='nearest')
ax.set_yticks(np.arange(len(labels)))
ax.set_yticklabels(labels)
导入matplotlib.pyplot作为plt
导入matplotlib.colors
将numpy作为np导入
#创建更逼真的数据
#-看起来很复杂,但只是有一个恒定的关闭和打开概率
#每列
#-结果是一个20 x 500的布尔数组
p_开关=0.02
p_关闭=0.05
data=np.empty((20500),dtype='bool')
数据[:,0]=np.random.random(20)<.2
对于范围(1500)内的c:
r=np.随机。随机(20)
数据[数据[:,c-1],c]=(r>p_关闭)[数据[:,c-1]]
数据[-data[:,c-1],c]=(r
创造
当然,你会想使用一些不那么奇怪的颜色方案,但这实际上取决于你的艺术观点。这里的技巧是,行
n
上的所有True
元素都有值n+1
和,所有False
元素都是0
中的data\u color
。这使得创建颜色贴图成为可能。当然,如果您想要两种或三种颜色的循环颜色贴图,只需在imshow
by中使用data\u color
的模数,例如data\u color%3
谢谢您的回答!你知道这类图形的名称吗?+1似乎也是使用Matplotlib制作的,看起来完全一样。值得一提的是,我发现在这个应用程序中使用插值会产生误导,这表明在冰箱和电话之间有一个渐进的过渡!我更喜欢直条,但可能会选择一些漂亮的颜色。@Constantine:我会称之为时间线图,但我真的不知道是否会有更好的名称。不幸的是,带状图是为其他东西保留的。@BasSwinckels:是的,插值在这里不是最好的。我添加了一个带有颜色的非插值版本(不知道颜色的精确性)。从可视化的角度来看,我实际上在不同的块之间有三行数据(颜色/深色)和一行空行(黑色),因为这将使每一行在视觉上更容易理解。高质量的回答。这应该得到某种奖励。