python - 具有颜色渐变的 3D 散点图,其中颜色取决于计数

标签 python matplotlib colors matplotlib-3d

我有一个包含点的数据框,其中包括点的 x、y 和 z 坐标以及“计数”,每个数据点的数字在 1 到 187 之间。 我想将“计数”与颜色渐变相关联,例如1是绿色,187是红色,然后用x、y和z坐标绘制数据点的散点图,其中每个数据点的颜色都被编码“计数”的信息。 我发现颜色渐变的代码非常困惑,你能帮我吗?

编辑:zelusp 完全回答了我的问题,谢谢。

EDIT1:我想知道我是否应该编写单独的问题,但由于它是关于同一段代码,也许我只需编辑上一个问题就可以找到答案。 最近我更换了笔记本电脑,并在新机器上安装了 Ubuntu 18.04。这段代码在 Ubuntu 16.04 上完美运行,但在我的新机器上不起作用。 我的代码是:

cmap = plt.cm.rainbow
norm = mpl.colors.Normalize(vmin=np.min(df3.h_count), vmax=np.max(df3.h_count))

fig=plt.figure()
ax1=fig.add_subplot(111, projection='3d')
ax1.scatter(df3.zm_bin, df3.sfr_bin, 12.+np.log10(df3.medijana), s=10, c=cmap(norm(df3.h_count)), marker='o') 
ax1.set_xlim(8,12.5)
ax1.set_xlabel('Log(Mz)')
ax1.set_ylabel('LogSFR') #treba invertovati
ax1.set_zlabel('12+log(Z)')
ax1.invert_yaxis()

sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
sm.set_array([])
fig.colorbar(sm)

我收到的错误是这样的:

Traceback (most recent call last):
  File "load_subhalos.py", line 233, in <module>
    ax1.scatter(df3.zm_bin, df3.sfr_bin, 12.+np.log10(df3.medijana), s=10, c=cmap(norm(df3.h_count)), marker='o') 
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/colors.py", line 938, in __call__
    result, is_scalar = self.process_value(value)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/colors.py", line 924, in process_value
    result = np.ma.array(data, mask=mask, dtype=dtype, copy=True)
  File "/usr/local/lib/python2.7/dist-packages/numpy/ma/core.py", line 6358, in array
    ndmin=ndmin, shrink=shrink, order=order)
  File "/usr/local/lib/python2.7/dist-packages/numpy/ma/core.py", line 2784, in __new__
    order=order, subok=True, ndmin=ndmin)
TypeError: float() argument must be a string or a number

我没有更改代码中的任何内容,唯一的更改是新机器和操作系统。你知道我为什么会遇到这个问题吗?

最佳答案

我建议您浏览一下 matplotlib 上的这些帖子:

考虑到这一点,我做了以下事情:

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

#%% Generate mock data
number_of_datapoints = 30
x = np.random.rand(number_of_datapoints)
y = np.random.rand(number_of_datapoints)
z = np.random.rand(number_of_datapoints)

count_min = 1
count_max = 187
data = np.random.randint(count_min, count_max, number_of_datapoints) # these are your counts

#%% Create Color Map
colormap = plt.get_cmap("YlOrRd")
norm = matplotlib.colors.Normalize(vmin=min(data), vmax=max(data))

#%% 3D Plot
fig = plt.figure()
ax3D = fig.add_subplot(111, projection='3d')
ax3D.scatter(x, y, z, s=10, c=colormap(norm(data)), marker='o')  
plt.show()

您可能还对 colorspacious 感兴趣

关于python - 具有颜色渐变的 3D 散点图,其中颜色取决于计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49617047/

相关文章:

Python/Matplotlib 子图 - 堆积条形图 - 为类别设置固定颜色

css - CSS3颜色的精确语法

python - 为什么这个字典定义会引发语法错误?

python - Django 应用程序安装脚本 - 如何将应用程序添加到 INSTALLED_APPS 设置?

python - 尝试修复tkinter GUI卡住(使用线程)

python - 定性热图图 python

Python 类型错误 : float() argument must be a string or a number, 而不是 'SingleBlockManager'

android - 如何根据进度更改搜索栏进度颜色?

python - 阻塞生成器似乎只生成一个值。为什么?

python - Matplotlib:获取子图以填充图形