我目前面临可视化三维数据的问题。具体地说,我有两个变化的参数,第三个维度是结果输出,在这种情况下是0到1之间的值(百分比)。
我想要说明几个不同的数据集。它在matplotlib(pcolor)中使用热图很有效。
但是,我想直接比较不同的数据集。我不太满意为每个数据集生成一个单独的图并以这种方式表示它。我不知何故想在一个图中绘制它以便能够直接比较它们。
我尝试过的3D图(散点图和曲面图)工作得相当不错,但是这些值是重叠的,大多数时候你只能看到一个数据集。 3D Plots实际上效果不佳。
所以我的主要问题是,如果有人知道如何在一个情节中代表这一点。
问候!
答案 0 :(得分:3)
虽然这是一个老问题,但我最近做了一些相关的事情:在同一个图中绘制两个热图。我通过将正方形转换为散点图来实现这一点,我将正方形转换为两个三角形。
我使用自定义标记制作了两个三角形:
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
def getCustomSymbol1(path_index=1):
if path_index==1: #upper triangle
verts = [
(0.0,0.0),
(1.0,0.0),
(1.0,1.0),
(0.0,0.0),]
else: #lower triangle
verts = [
(0.0,0.0),
(0.0,1.0),
(1.0,1.0),
(0.0,0.0),]
codes = [matplotlib.path.Path.MOVETO,
matplotlib.path.Path.LINETO,
matplotlib.path.Path.LINETO,
matplotlib.path.Path.CLOSEPOLY,
]
pathCS1 = matplotlib.path.Path(verts, codes)
return pathCS1, verts
def plot_mat(matrix=np.random.rand(20,20), path_index=1, alpha=1.0, vmin=0., vmax=1.):
nx,ny = matrix.shape
X,Y,values = zip(*[ (i,j,matrix[i,j]) for i in range(nx) for j in range(ny) ] )
marker,verts = getCustomSymbol1(path_index=path_index)
ax.scatter(X,Y,s=4000,
marker=marker,
c=values,
cmap='viridis',
alpha=alpha,
vmin=vmin, vmax=vmax )
return
fig = plt.figure()
ax = fig.add_subplot(111)
A = np.random.uniform(20,50,30).reshape([6,5])
B = np.random.uniform(40,70,30).reshape([6,5])
vmin = np.min([A,B])
vmax = np.max([A,B])
plot_mat(path_index=1,vmin=vmin,vmax=vmax,matrix=A)
plot_mat(path_index=2,vmin=vmin,vmax=vmax,matrix=B)
plt.xlim([0,6])
plt.ylim([0,5])
# for the colorbar i did the trick to make first a fake mappable:
sm = plt.cm.ScalarMappable(cmap='viridis', norm=plt.Normalize(vmin=vmin, vmax=vmax ) )
sm._A=[]
plt.colorbar(sm)
plt.show()
答案 1 :(得分:2)
有两个选项可以将2个数据集一起呈现:
选项1 - 绘制2个数据集差异的热图(或比率,在您的情况下更合适)
pcolor(D2-D1)
然后介绍其中几个比较数字。
选项2 - 将1个数据集显示为pcolor,将另一个数据集显示为countour:
pcolor(D1)
contour(D2)
如果你真的需要一起展示N> 2数据集,我会选择轮廓或轮廓f:
contourf(D1,cmap='Blues')
contourf(D2,cmap='Reds', alpha=0.66)
contourf(D2,cmap='Reds', alpha=0.33)
或
contour(D1,cmap='Blues')
contour(D2,cmap='Reds')
contour(D2,cmap='Reds')
不幸的是,simiar alpha技巧与pcolor效果不佳。
答案 2 :(得分:0)
我能想到的最好的方法是将一个绘制为高度(例如一个曲面),另一个绘制为映射到此曲面的热图。 @HYRY给出here的答案是一个随机着色的示例,您需要使用一个数据集指定colors
数组
你也可以考虑一下它们是如何相关的,如果你把它们除以另一个,你能得到一些其他参数来编码正在发生的事情,或者减去它们吗?