图例条目的数量等于数据集的大小

Posted

技术标签:

【中文标题】图例条目的数量等于数据集的大小【英文标题】:Number of legend entries equals the size of data set 【发布时间】:2019-03-04 18:40:04 【问题描述】:

我在 for 循环中绘制了许多数据集。集的数量和集的大小在绘图时没有任何问题。当我尝试添加一个图例时,事情变得有趣起来。我得到一个传奇,但我只得到第一个标签出现数百次!我有一个 887 个点的数据集,我得到 887 个图例条目。Here is the plot I get

您可以在此处访问 .py 和 .xlsx 文件: https://drive.google.com/drive/folders/1QCVw2yqIHexNCvgz4QQfJQDGYql1hGW8?usp=sharing

这是生成绘图的代码。

# Temperature Data plotting 
=================================================
#initialize figure
plt.figure(figsize=(11,8))
Color = 'C'
Marks = '*','o','+','x','s','d','.'
nm = len(Marks)
q = 0 # Marks counter
c = 0 # color counter
for k in range(0,nt):
    style = 'C' + str(c) + Marks[q]
    test = 'T' + str(k)
    plt.plot([t+t_adjust[k]],[Temps[:,k]],style,label=test)
    #, label = 'test'
    c += 1
    if(c==6):
        c = 9
    if(c==10):
        c = 0
        q += 1
    if(k > nt-10):
        q = nm - 1
# Formatting Figure
#names = '1','2','3','4','5'
#name1 = '1'
#pylab.legend([name1])
#from collections import OrderedDict
#import matplotlib.pyplot as plt
#handles, labels = plt.gca().get_legend_handles_labels()
#by_label = OrderedDict(zip(labels, handles))
#plt.legend(by_label.values(), by_label.keys())      
plt.legend(loc = 'upper right')
plt.show()
# x axis limits, in seconds
plt.xlim(0,60)
plt.xlabel('t (s)')
plt.ylabel('T (deg C)')
FigTitle = (oper_name + '; ' + str(pres_val) + pres_unit + '; d=' +
    str(diam_val) + diam_unit + '; H=' + str(dist_val) + dist_unit)
plt.title(FigTitle)
# End Temperature Data Plotting     
==============================================

我有 14 组数据,每组 887 点。显然有超过 14 个图例条目。不知道为什么它以某种方式引用数据的长度或其他东西。我找到了这个(下面的代码)来查找句柄和标签,但我需要为每个数据集分配样式名称,而不是数据长度的第一个样式名称。

#from collections import OrderedDict
#import matplotlib.pyplot as plt
#handles, labels = plt.gca().get_legend_handles_labels()
#by_label = OrderedDict(zip(labels, handles))
#plt.legend(by_label.values(), by_label.keys())

【问题讨论】:

发布一段代码会很有用,它实际上显示了错误,最好是可重现的。 (帮助人们帮助您)有时在实际代码中可能会出现意外错误,但在提供的representative 代码中却没有。另外,这里有很多注释掉的代码。这对这个问题有用吗? 我很困惑:您的情节显示标签"hmmm",但这些字母甚至没有出现在代码中。相反,人们会期望看到以"T" 开头的标签,后跟一些数字。我敢肯定,一旦您提供了 minimal reproducible example,即重现不良行为的可运行代码,它将在几分钟内得到解决。 @Tushar,我添加了一个链接供您下载我正在使用的代码和 Excel 文件。 @ImportanceOfBeingErnest,我更新了该图以正确表示正在发生的事情,但在提交之前我忘了更新它。代码可以在 google drive 的链接中找到。 抱歉,我不会这么称呼minimal reproducible example。但也许其他人有足够的带宽来下载这些东西并查看那些冗长的代码。 【参考方案1】:

如果不看数据就很难说,但您始终可以像这样手动控制图例中的内容:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0., 2*np.pi, 101, endpoint=True)

lns = []
for i in range(1, 10):
    for j in range(10):
        ln = plt.plot(x, j*np.sin(x/i), label="series i=:d".format(i))

    lns += ln # note plt.plot returns a list of entities

plt.legend(lns, [l.get_label() for l in lns], loc="best")
plt.show()

【讨论】:

所以我可以在你有“series i=:d”的地方放一些字符串系列吗? 是的,这里我只是做了一个例子,但是你可以在一个单独的列表中定义标签,其中元素匹配 range(1, 10)。如果是这种情况,您甚至可以用该列表替换图例中的 [l.get_label() for l in lns] 位。

以上是关于图例条目的数量等于数据集的大小的主要内容,如果未能解决你的问题,请参考以下文章

matplotlib:两个数据集的相同图例

在 ggplot2 中创建具有不同数据集的图例

如何在ggplot中更改不同数据集的线条颜色并具有图例

给定大小的非相邻集的数量

Redis 最优哈希集条目大小

Chart.js 从图例中删除数据集值的标签