Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Matplotlib 3D散点图中丢失的颜色_Python_Matplotlib_Colors_3d_Scatter Plot - Fatal编程技术网

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

Python Matplotlib 3D散点图中丢失的颜色,python,matplotlib,colors,3d,scatter-plot,Python,Matplotlib,Colors,3d,Scatter Plot,对于一个项目,我正在做一些三维散点图,下面有三个对应的投影。我使用不同的颜色来表示第四个参数。首先,我用某种颜色绘制数据,然后用不同颜色的其他数据过度绘制数据,这样,最终的顺序是,我可以看到我想要的一切: 在开始的时候,这很好,但是当我尝试用稍微不同的数据做同样的事情时,颜色会变得混乱。投影中显示的颜色是正确的,但其中一些颜色在3D绘图中丢失,因此它们不再匹配: 当我以一种有趣的方式旋转3D绘图时,颜色被恢复,我可以看到它们本来的样子: 然而,我不想要一个以一种有趣的方式旋转的3D绘图,因

对于一个项目,我正在做一些三维散点图,下面有三个对应的投影。我使用不同的颜色来表示第四个参数。首先,我用某种颜色绘制数据,然后用不同颜色的其他数据过度绘制数据,这样,最终的顺序是,我可以看到我想要的一切:

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

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

然而,我不想要一个以一种有趣的方式旋转的3D绘图,因为轴被弄乱了,不可能像那样正确地读取它

我在这里找到了一个解决问题的方法: . 它基本上说我应该用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'
指定要使用的,而“o”标记是一个大的填充圆,这就是为什么您的绘图看起来很难看。

您可以共享代码吗?您可以指定使用的数据结构,或者表示您正在使用的数据的形状吗?此外,您正在使用的两个数据集有多大的不同(一个数据集中的某些特征是否与另一个数据集中的特征相比较?——这可以解释旋转图表时出现红色的原因。但这仍然很奇怪)?我包括了我的代码。数据集只是numpy数组,第二个数组应该是第一个数组的子集,也就是说,它只包含第一个数组中出现的点,但它们只是更少。除此之外,没有任何变化。我认为这是一个错误,我没有办法改变它显示数据的顺序。现在我刚刚解决了它唱“plot”而不是“scatter”。加载()函数似乎依赖于六个
.npy
文件。您可以发布这些文件的一些最低版本,或者在脚本中包含一些示例数据吗?我的印象是,重叠是其他评论中提到的问题。我建议对数据进行下采样或添加抖动或抖动,以消除数据点的歧义,请参阅[这个答案]()整理顺序可能会允许显示所有颜色,但最终会导致数据表示不太准确,例如,即使区域包含这些结果,区域也不会显示TD=80。鉴于您的工作性质,这可能或多或少是一个问题。请您为debu提供“50pctTemperaturesTd=10.npy”文件内容g目的。