Matplotlib 3D图表的颜色编码按值范围分类

4

我想生成一个带有两种颜色的3D图形。一种颜色用于值大于零,另一种颜色用于值小于零。但我无法找到如何在代码中实现这个功能。

这是我的当前代码:

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import matplotlib.tri as mtri
import pandas as pd
import numpy as np

df = pd.DataFrame.from_csv('...temp\\3ddata.csv', sep = ',', index_col  = False)

fig = plt.figure()
ax = fig.gca(projection='3d')

x = df['P']
y = df['T']
z = df['S']

ax.plot(x, y, zs= 0, zdir = 'z', c= 'r')

ax.scatter(x,y, z, c = 'b', s = 20)

ax.set_xlabel('Pressure (Bar)')
ax.set_zlabel('Residual subcooling (J*Kg-1*K-1')
ax.set_ylabel('Temperaure of LNG (K)')

plt.show()

3DPLOT

我读了几个例子,但无法将它们应用到我的数据上。是否可以通过for循环来实现这个目标?

或者类似于以下内容:

use_c = {<=0: "red", >=0 "blue"}

#ax.plot(x, y, zs= 0, zdir = 'z', c= 'r')

ax.scatter(x,y, z, c = [use_c[x[0]] for x in z], s = 20)

将z的值与颜色相关联的某些内容。


你可以尝试使用地震色图 http://matplotlib.org/users/colormaps.html - JeD
哪个值,y 还是 z? - Reblochon Masque
3个回答

5

我终于弄明白了。

我需要为c指定一个变量,然后在ax.scatter(*kwargs)中引用它:

c = (z<=0)

ax.scatter(x,y,z, c = c, cmap = 'coolwarm', size = 30)

这样就可以得到下面这个漂亮的图形:enter image description here


4
如果你在可选参数 c 的值中传递一个布尔数组给 scatter,则你可以从当前色图的极端处获得两种颜色的点。
ax.scatter(x,y, z, c = z<0, s = 20)

您可能希望将边缘宽度设置为零,否则所有的点看起来几乎都是黑色。


1

很遗憾,这些只适用于二维散点图。 - Joey
抱歉,我以为它的工作方式是相同的。看起来它有点棘手。你看过这个问题吗?https://dev59.com/yG7Xa4cB1Zd3GeqPutso - bamdan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接