gpt4 book ai didi

python - Matplotlib 3D 散点图中的颜色丢失

转载 作者:IT老高 更新时间:2023-10-28 22:16:08 27 4
gpt4 key购买 nike

对于一个项目,我正在制作一些 3D 散点图,其中包含三个相应的投影。我使用不同的颜色来表示第四个参数。首先我用某种颜色绘制数据,然后用不同颜色的其他数据重叠绘制,这样最后的顺序就是我可以看到我想要的一切:

This is what I want!

一开始这很好用,但是当我尝试用稍微不同的数据做同样的事情时,颜色会变得困惑。投影中显示的颜色是正确的,但其中一些在 3D 图中丢失,因此不再匹配:

Colors messed up :(

当我以一种有趣的方式旋转 3D 绘图时,颜色恢复了,我可以看到它们应该是的样子:

Funny rotation

但是,我不想要以有趣的方式旋转的 3D 绘图,因为轴会被弄乱,并且无法像那样正确读取它。

我在这里找到了一个解决问题的方法: plotting 3d scatter in matplotlib .它基本上说我应该用 ax.plot(X,Y,'o') 替换我的 ax.scatter(X,Y)。当我这样做时,颜色会以应有的方式显示,但这样的情节会更加困惑和丑陋。基本上我只是希望能够用散点图来做到这一点。

有人知道怎么解决吗?

这是我的代码的最小示例,只有两种颜色:

from mpl_toolkits.mplot3d import art3d
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import gridspec

art3d.zalpha = lambda *args:args[0]

numcols = 20
percentage = 50

def load(Td, pc):
T = np.load(str(pc) + 'pctTemperaturesTd=' + str(Td) + '.npy')
D = np.load(str(pc) + 'pctDensitiesTd=' + str(Td) + '.npy')
CD = np.load(str(pc) + 'pctColDensitiesTd=' + str(Td) + '.npy')
return T, D, CD

def colors(ax):
colors = np.zeros((numcols, 4))
cm = plt.get_cmap('gist_rainbow')
ax.set_color_cycle([cm(1.*i/numcols) for i in range(numcols)])
for i in range(numcols):
color = cm(1.*i/numcols)
colors[i,:] = color
return colors

# LOAD DATA
T10, D10, CD10 = load(10, percentage)
T200, D200, CD200 = load(200, percentage)

# 3D PLOT
fig = plt.figure(1)
gs = gridspec.GridSpec(4, 4)

ax = fig.add_subplot(gs[:-1,:-1], projection='3d')
colours = colors(ax)

ax.plot(T200/100., np.log10(D200), np.log10(CD200), '*', markersize=10,color=colours[10], mec = colours[10], label='Td = 200', alpha=1)
ax.plot(T10/100., np.log10(D10), np.log10(CD10), '*', markersize=10,color=colours[0], mec = colours[0], label='Td = 10', alpha=1)

ax.set_xlabel('\nTg/100', fontsize='x-large')
ax.set_ylabel('\nlog(nH)', fontsize='x-large')
ax.set_zlabel('\nlog(colDen)', fontsize='x-large')
ax.set_xlim(0,5)
#ax.set_zlim(0,)
ax.set_ylim(2,6)

# PROJECTIONS

# Tg, nH
ax2 = fig.add_subplot(gs[3,0])

ax2.scatter(T200/100., np.log10(D200), marker='*', s=10, color=colours[10], label='Td = 200', alpha=1, edgecolor=colours[10])
ax2.scatter(T10/100., np.log10(D10), marker='*', s=10, color=colours[0], label='Td = 10', alpha=1, edgecolor=colours[0])

ax2.set_xlabel('Tg/100')
ax2.set_ylabel('log(nH)')
ax2.set_xlim(0,6)

# Tg, colDen
ax3 = fig.add_subplot(gs[3,1])

ax3.scatter(T200/100., np.log10(CD200), marker='*', s=10, color=colours[10], label='Td = 200', alpha=1, edgecolor=colours[10])
ax3.scatter(T10/100., np.log10(CD10), marker='*', s=10, color=colours[0], label='Td = 10', alpha=1, edgecolor=colours[0])

ax3.set_xlabel('Tg/100')
ax3.set_ylabel('log(colDen)')
ax3.set_xlim(0,6)

# nH, colDen
ax4 = fig.add_subplot(gs[3,2])

ax4.scatter(np.log10(D200), np.log10(CD200), marker='*', s=10, color=colours[10], label='Td = 200', alpha=1, edgecolor=colours[10])
ax4.scatter(np.log10(D10), np.log10(CD10), marker='*', s=10, color=colours[0], label='Td = 10', alpha=1, edgecolor=colours[0])

ax4.set_xlabel('log(nH)')
ax4.set_ylabel('log(colDen)')

# LEGEND
legend = fig.add_subplot(gs[:,3])

text = ['Td = 10', 'Td = 20', 'Td = 30', 'Td = 40', 'Td = 50', 'Td = 60', 'Td = 70', 'Td = 80', 'Td = 90', 'Td = 100', 'Td = 110', 'Td = 120', 'Td = 130', 'Td = 140', 'Td = 150', 'Td = 160', 'Td = 170', 'Td = 180', 'Td = 190', 'Td = 200']

array = np.arange(0,2,0.1)
for i in range(len(array)):
legend.scatter(0, i, marker='*', s=100, c=colours[numcols-i-1], edgecolor=colours[numcols-i-1])
legend.text(0.3, i-0.25, text[numcols-i-1])
legend.set_xlim(-0.5, 2.5)
legend.set_ylim(0-1, i+1)

legend.axes.get_xaxis().set_visible(False)
legend.axes.get_yaxis().set_visible(False)

gs.tight_layout(fig)

plt.show()

最佳答案

而不是使用 ax.plot(x,y, 'o') 尝试 ax.plot(x,y,'.')ax .plot(x,y,'*''o' 指定要使用的 marker,'o' 标记是一个大的实心圆圈,这就是为什么你的情节看起来很丑。

关于python - Matplotlib 3D 散点图中的颜色丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30235923/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com