我遇到了一个3D matplotlib图显示后续的2D线轮廓与时间的问题。图结束时正是我想要它看起来,除了2D轮廓是以错误的顺序相互重叠,这使任何人谁查看图。轮廓被正确绘制沿着时间轴,但这几乎就像它们是以相反的顺序添加到图中的。我认为这与matplotlib中的“zorder”术语有关,但我一直没有成功解决这个问题。有人有什么建议吗?
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.lines import Line2D
from matplotlib.collections import LineCollection
import matplotlib.pyplot as plt
profiles = []
times = []
index = 0
for item in intensities:
integrated_profile = integrate(item)
profiles.append(list(zip(x_coordinates, integrated_profile)))
timestamps = int(index+1)
times.append(timestamps)
index += 1
profiles = np.array(profiles)
times = np.array(times)
profile_collection = LineCollection(profiles, colors=color_list) #color_list not shown here
fig = plt.figure(dpi=100, figsize=(18,6))
ax = fig.add_subplot(111, projection='3d',proj_type='ortho')
ax.add_collection3d(profile_collection, zs=times, zdir='y')
# I deleted a lot more lines of code which are just formatting the plot
字符串
的数据
2条答案
按热度按时间6ljaweal1#
我找到了一个解决方法。这实际上是创建这种类型的图的更简单的方法。而不是将2D配置文件存储在集合中,我只是循环并将它们单独添加到3D图中。集合没有固定的zorder值,所以你不能改变我想要改变的东西。当你循环并单独绘制每个2D配置文件时,你可以根据你的需要设置zorder参数。下面是我所做的:
字符串
的数据
qmelpv7a2#
有另一个非常快速的方法来解决3D中单线的非直观重叠。看起来matplotlib只是绘制从输入开始到其结束的单一曲线。如果数据按升序排序,例如按时间顺序排序,就像问题的例子一样,这往往会首先绘制“最近”的曲线。下一条距离较远的曲线应该出现在第一条曲线的后面,但是matplotlib绘制的任何新曲线都只是在其他曲线的顶部。
**解决方法:**将数据排序,使绘图从后台开始,然后移到前台。在示例中,这意味着降序,即最后一个时间戳优先。然后,透视和重叠顺序是一致的。最后一条曲线将是与所有其他曲线重叠的“最近”曲线。
在问题的例子中,这可以通过反转
profiles
2d数组的列和反转time
数组来实现:字符串
或者,我假设,交换时间轴而不是重新排序数据也可以做到这一点,但我还没有测试过,无论如何,这可能是不希望的。