修复Matplotlib中LineCollections 3D绘图中Zorder参数的顺序

hmae6n7t  于 2023-11-22  发布在  其他
关注(0)|答案(2)|浏览(124)

我遇到了一个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

字符串


的数据

6ljaweal

6ljaweal1#

我找到了一个解决方法。这实际上是创建这种类型的图的更简单的方法。而不是将2D配置文件存储在集合中,我只是循环并将它们单独添加到3D图中。集合没有固定的zorder值,所以你不能改变我想要改变的东西。当你循环并单独绘制每个2D配置文件时,你可以根据你的需要设置zorder参数。下面是我所做的:

profiles = []
times = []

index = 0

for item in intensities:
    integrated_profile = integrate(item)
    profiles.append(integrated_profile)
    
    timestamps = int(index+1)
    times.append(timestamps)

    index += 1

profiles = np.array(profiles)
times = np.array(times)

fig = plt.figure(dpi=100, figsize=(18,6))
ax = fig.add_subplot(111, projection='3d',proj_type='ortho')

index2 = 0
for i in profiles:
    ax.plot(x_coordinates, profiles[index2], zs=times[index2], zdir='y', 
            zorder=(len(profiles) - index2), color=next(colors))
    index2 += 1

字符串


的数据

qmelpv7a

qmelpv7a2#

有另一个非常快速的方法来解决3D中单线的非直观重叠。看起来matplotlib只是绘制从输入开始到其结束的单一曲线。如果数据按升序排序,例如按时间顺序排序,就像问题的例子一样,这往往会首先绘制“最近”的曲线。下一条距离较远的曲线应该出现在第一条曲线的后面,但是matplotlib绘制的任何新曲线都只是在其他曲线的顶部。

**解决方法:**将数据排序,使绘图从后台开始,然后移到前台。在示例中,这意味着降序,即最后一个时间戳优先。然后,透视和重叠顺序是一致的。最后一条曲线将是与所有其他曲线重叠的“最近”曲线。

在问题的例子中,这可以通过反转profiles 2d数组的列和反转time数组来实现:

profiles = np.array(profiles)
times    = np.array(times)

profiles = profiles[:, ::-1]    # Reverse columns of a 2d-array
times    = [::-1]               # Invert 1d-array

字符串
或者,我假设,交换时间轴而不是重新排序数据也可以做到这一点,但我还没有测试过,无论如何,这可能是不希望的。

相关问题