为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

偶然的你 2021-09-14 13:42:27
在不更改任何代码的情况下,绘制的图形将有所不同。在新的 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,正方形代表 BB = 正方形。看周围的方块(-3, -3.8),这个数据点来自数据集B。而如果我在同一个终端中再次运行代码,python3 my_code.py注意 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)请注意,我注释了打印每个实例的代码。这是经过测试的,因为我认为这可能是在代码的其他部分更改了实例的顺序。但结果显示正确和错误的情况下,顺序都没有改变。有谁知道发生了什么?有没有人经历过这种情况?如果我需要在代码末尾清理内存,我该怎么办?
查看完整描述

2 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

由于您的代码不完整,因此很难确定,但似乎标记的顺序被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具有相同的长度,并且标记在列表中与您要分配的应变值位于相同的位置。


查看完整回答
反对 回复 2021-09-14
?
POPMUISE

TA贡献1765条经验 获得超5个赞

我发现这个问题是由我在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]))

因此,我问的问题不是一个有效的问题。感谢和抱歉大家都调查了这个。


查看完整回答
反对 回复 2021-09-14
  • 2 回答
  • 0 关注
  • 269 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信