用colormap Python进行三维绘图

2024-09-27 21:27:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试制作一个三维曲面图,显示voltagetemp与{},并将每个点的颜色缩放为另一组值,即bifurWidth。在

下面是我的代码。在

我的代码有问题:

  1. 我不能为使用loadtxt生成的'bifurWidth'numpy.ndarray运行我的代码。本例中的错误是Color array must be two-dimensional。但是,如果我使用np.arange()生成一组虚拟的bifurWidth值,它就会运行。为什么两者都是numpy.ndarrays时会发生这种情况?在
  2. 我不知道如何让这个工作,与一个可见的图例,三维曲面图。在

有什么想法吗?在

我的代码是:

from glob import glob
from pylab import *
import numpy as np
from matplotlib import cm

import os

fs = 22

# Import data.
voltage = np.loadtxt('NonLorentzianData.txt',usecols=[0])
power = np.loadtxt('NonLorentzianData.txt',usecols=[1])
bifurWidth = arange(len(voltage))#np.loadtxt('LorentzianData.txt',usecols=[3])
temp = np.loadtxt('NonLorentzianData.txt',usecols=[4])
path = np.loadtxt('NonLorentzianData.txt',usecols=[5],dtype='S16')
c = np.abs(bifurWidth)

#Plot a 3D pot showing Temperature/Voltage/Power and intensity of colour showing bifurcation size.
fig = figure()
ax = fig.add_subplot(111, projection='3d')
cmhot = get_cmap("hot")
ax.scatter(voltage,temp,power,bifurWidth,s=35,c=c,cmap=cmhot)
ax.set_ylabel('Temperature (mK)',fontsize=fs)
ax.set_xlabel('Voltage (V)',fontsize=fs)
ax.set_zlabel('Power (dB)',fontsize=fs)
ax.set_title('Locating bifurcations.',fontsize=fs)
fig.tight_layout()
fig.set_size_inches(25,15)
fig.savefig('TEST.PNG',dpi=300)

Tags: 代码importtxtnpfigaxfstemp
2条回答

根据this问题的答案,3D散点图不能与图例一起使用,因此需要制作一个没有显示的虚拟图来创建图例。下面是一个与您的问题相关的示例,该问题将图例添加到三维散点图:

from mpl_toolkits.mplot3d import Axes3D
from pylab import *
import numpy as np
from matplotlib import cm

# Fake data
(voltage, temp) = np.meshgrid(range(10), range(10))
power1 = np.random.rand(10,10)
power2 = np.random.rand(10,10)
bifurWidth1 = 100*np.random.rand(10.,10.)
bifurWidth2 = np.random.rand(10.,10.)

# Plot data
fig = figure()
ax = fig.add_subplot(111, projection='3d')
cm1 = get_cmap("Blues")
cm2 = get_cmap("Reds")
ax.scatter(voltage, temp, power1, c = bifurWidth1, s=35,  marker = 'o', cmap = cm1)
ax.scatter(voltage, temp, power2, c = bifurWidth2, s=35, marker = "^", cmap = cm2)

# Make legend
scatter1_proxy = matplotlib.lines.Line2D([0],[0], linestyle="none", c=cm1(128), marker = 'o')
scatter2_proxy = matplotlib.lines.Line2D([0],[0], linestyle="none", c=cm2(128), marker = '^')
ax.legend([scatter1_proxy, scatter2_proxy], ['label1', 'label2'], numpoints = 1)

# Label axes
fs = 12
ax.set_ylabel('Temperature (mK)',fontsize=fs)
ax.set_xlabel('Voltage (V)',fontsize=fs)
ax.set_zlabel('Power (dB)',fontsize=fs)
ax.set_title('Locating bifurcations.',fontsize=fs)

plt.show()

3d scatter plot with legend

首先,你说你想做一个表面图,但是在你的代码中你做了一个散点图。根据你剩下的问题描述,我假设你想做一个散点图。

当我查看scatterplot函数的documentation时,我看到了以下定义:

Axes3D.scatter(xs, ys, zs=0, zdir=u'z', s=20, c=u'b', depthshade=True, *args, **kwargs)

你称之为:

^{pr2}$

这意味着第四个形式参数zdir,将用bifurWidth的值来调用。这不是您想要的,您需要使用默认值zdir,并使用绝对值bifurWidth作为颜色(通过设置c=c已经完成的第二件事)。

因此,只需删除bifurWidth参数,如下所示:

ax.scatter(voltage,temp,power,s=35,c=c,cmap=cmhot)

这应该可以消除错误。

相关问题 更多 >

    热门问题