在Matplotlib绘图中标记最小点

5

示例代码:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
xlist = [1, 2, 3, 4, 5]
ylist = [1, 5, 3, 4, 2]
zlist = [6, -3, 6, -1, 2]
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(xlist, ylist, zlist)
plt.ticklabel_format(useOffset=False)   
plt.show()

一个简单的3D散点图...假设我想让z轴上的最小点显示为不同的颜色。那么这个点就是第二个点:x=2,y=5,z=-3。实现这个最简单的方法是什么?(注意:如果有多个最小值,则所有最小值都应该被突出显示)

我的解决方法是使用min函数在zlist中找到最小值,然后使用zlist.index(min(zlist))找到最小值的索引,接着将xlistylistzlist中的该项删除(并保存它)。然后使用另一个ax.scatter命令单独绘制该点(即最小值)。但这似乎相当不优雅,而且对于平局情况也无法处理。

1个回答

7
你可以使用NumPy来查找zlist中的最小值,并生成一个布尔数组,其中zlist等于zmin时为True(注意这可能会发生多次)。然后使用np.where生成一个数组,当maskTrue时为red,否则为blue
zmin = np.min(zlist)
mask = np.array(zlist) == zmin
color = np.where(mask, 'red', 'blue')

您可以将 color=color 传递给 ax.scatter,从而创建所需的散点图:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

xlist = [1, 2, 3, 4, 5]
ylist = [1, 5, 3, 4, 2]
zlist = [6, -3, 6, -1, 2]
zmin = np.min(zlist)
mask = np.array(zlist) == zmin
color = np.where(mask, 'red', 'blue')
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(xlist, ylist, zlist, color=color)
plt.ticklabel_format(useOffset=False)   
plt.show()

enter image description here


1
你比我快了几秒钟。使用where非常聪明。这绝对是最小浪费的正确解决方案。+1 - Mad Physicist
今天我学到了关于“where”... numpy 真的有任何函数,谢谢。 - iammax

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