【问题标题】:How to show Matplotlib Marker symbols as a string如何将 Matplotlib 标记符号显示为字符串
【发布时间】:2017-04-25 15:34:27
【问题描述】:

我正在尝试设置我的 Matplotlib 多图的“副标题”,如下所示:

plt.gcf().suptitle("pc1\npc2", fontsize=10)

下图展示了它的样子:

现在,我想展示一种伪图例,而不是下一行的“pc2”,但没有任何装饰,只是简单的符号,如下面相应的 R 图中所示:

看到第二行显示一个“正方形”后跟 MRP 字样,另一个正方形后跟 XRD,等等?我正在尝试复制它(不完全但接近)。正如您在我上面显示的代码行中看到的那样,新行字符“\n”将标题文本字符串推到下一行。如果我可以使用标记符号(正方形、三角形、星形等)大致格式化第二行,那么我就准备好了。确切的标记无关紧要,我可以使用任何可以被标题字符串解释和显示为符号的标记。我选择的标记向量如下所示(但可以更改为任何 5 个符号的集合):

markers_list = ["s", "o", "*", "^", "+"]

如果您想查看完整的 Python 代码和更多详细信息,可以在以下线程中看到:

MatplotLib Seaborn Multiple Plot Formatting

我不想显示该线程中讨论的图例。第二行的简单字符串表示就足够了。

【问题讨论】:

  • 你为什么不使用一个真正的传奇人物和一个假演员,例如在这里解释:stackoverflow.com/questions/22348229/…
  • 不使用图例似乎比使用图例更复杂。那么按照您链接到的上一篇文章中的说明使用图例有什么问题?
  • @ImportanceOfBeingErnest,传说仅限于您在上一篇文章中解释的众多情节之一。而将其放置在顶部并均匀间隔正确地传达了适用于所有地块的信息。如果我错了,请纠正我。

标签: python matplotlib symbols markers


【解决方案1】:

这是一个在其中一个图上使用图例但将其定位在图形坐标中的示例。

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(12)
import seaborn.apionly as sns
plt.rcParams["figure.figsize"] = 7,3.5

markers_list = ["s", "o", "*", "^", "+"]
labels = ["MRP","XRD","Geochem","GC", "OR"]

fig, axes = plt.subplots(ncols=3)
for i, ax in enumerate(axes):
    a = np.random.normal(size=(66))
    sns.distplot(a, ax=ax, hist_kws={"ec":"k","fc":(i/3.,0,1-i/3.)})
    this_x= np.array([-1,0,1.5])
    data_x, data_y = ax.lines[0].get_data()
    this_y = np.interp(this_x, data_x, data_y)
    for i, m, l in zip(range(len(labels)), markers_list, labels):
        ax.plot(this_x, this_y-i*0.016,  marker=m, markersize = 3, 
                color="black", ls="", label=l)

fig.suptitle("pc1",x=0.5,y=0.98)

axes[0].legend(loc="lower center", ncol=5,
        bbox_to_anchor=(0.5,0.8),bbox_transform=plt.gcf().transFigure)
plt.tight_layout()
plt.subplots_adjust(top=0.8)
plt.show()

【讨论】:

  • 这行得通,谢谢。但是,当我将代码复制并粘贴到我的机器上并运行它时,我在图例中得到了双标记,而不是上面显示的每个标记。你知道为什么吗?我不知道如何粘贴我得到的数字,因为我不能再编辑我的原始帖子了。
  • 我在 stackoverflow 上找到了答案 :) 我必须在 axs[0].legend 调用中添加 numpoints=1。现在显示与您在上面显示的完全一样。
  • 我使用的是matplotlib 2.0,默认有一个图例点;您可能有一个旧版本,默认情况下使用 2 个点。在这种情况下,您确实可以使用numpoints 来获得所需的结果。您可以使用下方的编辑按钮来编辑您的帖子,尽管它可能不再需要了。
猜你喜欢
  • 2017-03-10
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-22
  • 2019-05-20
相关资源
最近更新 更多