我的数据框,其中包括点的x,y和z坐标和"计数",每个数据点的数字在1到187之间。我想将"计数"与颜色梯度相关联,例如颜色绿色和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上的这些帖子中进行游览:
- matplotlib 3D散点图带有颜色梯度,这是您问题的几乎重复的
- 如何选择一个好的colormap,我建议您尝试使用
YlOrRd
颜色地图,因为它更容易阅读 - 如何将数字转换为matplotlib中的颜色尺度? 请特别注意
cmap
的使用和norm
变量以及cmap(norm(df.c.values))
中的使用方式。
考虑到这一点,我做了以下内容:
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()
您可能也对Colorspourial感兴趣