猿问

每次运行后 matplotlib 标记类型顺序不一致?

在不更改任何代码的情况下,绘制的图形将有所不同。在新的 bash 中第一次运行时正确,在接下来的运行中无序。(也许它可以循环回到正确的顺序)


具体来说:环境:MacOS Mojave 10.14.2,通过自制软件安装python3.7.1。

要做:scatter在同axes一个上绘制两组或三组数据,每组都有markertype不同的colors。绘制自定义图例,显示每个图例markertype代表哪个数据集。


很抱歉,我没有足够的时间准备可测试的代码(目前),但这部分似乎是问题所在:


markerTypes = cycle(['o', 's', '^', 'd', 'p', 'P', '*'])

strainLegends = []

strains = list(set([idx.split('_')[0] for idx in pca2Plot.index]))

for strain in strains:

    # markerType is fixed here, and shouldn't be passed on to the next python run anyway.

    markerType = next(markerTypes)


    # strainSamples connects directly to strain variable, then data is generated from getting strainSamples:

    strainSamples = [sample for sample in samples if

                     sample.split('_')[0] == strain]

    xData = pca2Plot.loc[strainSamples, 'PC1']

    yData = pca2Plot.loc[strainSamples, 'PC2']

    # See pictures below, data is correctly identified from source


    # both scatter and legend instance use the same fixed markerType

    ax.scatter(xData, yData, c=drawColors[strainSamples],

               s=40, marker=markerType, zorder=3)

    strainLegends.append(Line2D([0], [0], marker=markerType, color='k',

                                markersize=10,

                                linewidth=0, label=strain))

    # print([i for i in ax.get_children() if isinstance(i, PathCollection)])


ax.legend(handles=strainLegends)

如您所见markerType,strain数据与数据相关联。


对于python3 my_code.py在 bash 中的第一次运行,它创建了一个正确的图片:看到圆圈代表 A,正方形代表 B

B = 正方形。看周围的方块(-3, -3.8),这个数据点来自数据集B。

而如果我在同一个终端中再次运行代码,python3 my_code.py

http://img2.mukewang.com/614036660001428905570516.jpg

注意 A 和 B 完全聚集在一起,不相关。现在作为图例:A = 正方形,B = 圆形。再次查看(-3, -3.8)来自数据集 B的数据点,现在标注为 A。


如果我再次运行代码,它可能会产生另一个结果。


这是我用来生成注释的代码:


dictColor = {ax: pd.Series(index=pca2Plot.index), }

HoverClick = interactionHoverClick(

    dictColor, fig, ax)

fig.canvas.mpl_connect("motion_notify_event", HoverClick.hover)

fig.canvas.mpl_connect("button_press_event", HoverClick.click)

请注意,我注释了打印每个实例的代码。这是经过测试的,因为我认为这可能是在代码的其他部分更改了实例的顺序。但结果显示正确和错误的情况下,顺序都没有改变。

有谁知道发生了什么?有没有人经历过这种情况?如果我需要在代码末尾清理内存,我该怎么办?


偶然的你
浏览 270回答 2
2回答

BIG阳

由于您的代码不完整,因此很难确定,但似乎标记的顺序被cycle迭代器弄乱了。你为什么不试试:markerTypes = ['o', 's', '^']strainLegends = []for strain, markerType in zip(strains, markerTypes):    strainSamples = [sample for sample in samples if sample.split('_')[0] == strain]    xData = pca2Plot.loc[strainSamples, 'PC1']    yData = pca2Plot.loc[strainSamples, 'PC2']    ax.scatter(xData, yData, c=drawColors[strainSamples], s=40, marker=markerType, zorder=3)    strainLegends.append(Line2D([0], [0], marker=markerType, color='k',                                markersize=10,                                linewidth=0, label=strain))ax.legend(handles=strainLegends)这当然假设strains和markerTypes具有相同的长度,并且标记在列表中与您要分配的应变值位于相同的位置。

POPMUISE

我发现这个问题是由我在strains.# wrong code:strains = list(set([idx.split('_')[0] for idx in pca2Plot.index]))# correct code:strains = list(OrderedDict.fromkeys([idx.split('_')[0] for idx in pca2Plot.index]))因此,我问的问题不是一个有效的问题。感谢和抱歉大家都调查了这个。
随时随地看视频慕课网APP

相关分类

Python
我要回答