Matplotlib自定义标记

3
我希望有一些标记,例如空白方块加上+、x、.或其他任何东西,并可调整其厚度;事实上,就像Origin中的那些标记。似乎需要定制。
代码示例:
import numpy as np
import matplotlib.pyplot as plt

plt.plot(np.arange(10) ** 2,
         'k-',
         marker = 's',
         mfc = 'none',
         lw = 2,
         mew = 2,
         ms = 20)
plt.show()
2个回答

6
使用text标签,您可以使用字体中的任何可用字符。但需要自己遍历它们,而且我不认为您可以连续控制它们的线宽(如果有'bold'等,则当然可以选择)。

输入图像描述在这里

from numpy import *
import matplotlib.pyplot as plt

symbols = [u'\u2B21', u'\u263A', u'\u29C6', u'\u2B14', u'\u2B1A', u'\u25A6', u'\u229E', u'\u22A0', u'\u22A1', u'\u20DF']

x = arange(10.)
y = arange(10.)

plt.figure()
for i, symbol in enumerate(symbols):
    y2 = y + 4*i
    plt.plot(x, y2, 'g')
    for x0, y0 in zip(x, y2):
        plt.text(x0, y0, symbol, fontname='STIXGeneral', size=30, va='center', ha='center', clip_on=True)

plt.show()

您也可以直接使用plot,但呈现效果可能不太好,并且您对字符的控制力不够。

plt.figure()
for i, symbol in enumerate(symbols):
    y2 = y + 4*i
    plt.plot(x, y2, 'g')
    marker = "$%s$" % symbol
    plt.plot(x, y2, 'k', marker=marker, markersize=30)

enter image description here


看起来不错,但是使用pyplot.text()而不是pyplot.plot()绘图有点可惜。 - user1850133
你可以使用plot(参见编辑),但出于某些我不理解的原因,渲染效果不太好。如果是我,我会只编写一个名为plot_text的小函数,用于迭代text - tom10
我尝试了plt.plot(np.arange(10) ** 2, marker = u'\u2B21');但它返回了一个错误信息:UnicodeEncodeError: 'ascii' codec can't encode character u'\u2b21' in position 0: ordinal not in range(128)。 - user1850133
好的,现在我尝试使用美元符号;它工作得很好。这些字体代码在哪里指定?还有更多吗? - user1850133
是的,有很多很多字体代码。已定义了超过100,000个Unicode字符,并且每种字体都有这些字符的子集。要查看字体的这些内容,有特定的字体浏览器,但我通常只使用文字处理器,选择我想要使用的字体,然后使用“插入|特殊字符...”或类似的菜单选项,这将弹出一个对话框,显示字体中定义的所有符号,并显示每个符号的Unicode值。要查找具有特定符号的字体,只需搜索(例如,“Unicode雪花”)。 - tom10

3

这是您需要的内容吗?

通过叠加自定义标记

我是通过以下方式实现的:

import numpy as np
import matplotlib.pyplot as plt

plt.plot(np.arange(10) ** 2,
         'k-',
         marker = 's',
         mfc = 'none',
         lw = 2,
         mew = 2,
         ms = 20)

plt.plot(np.arange(10) ** 2 + 20,
         'k-',
         marker = '+',
         mfc = 'none',
         lw = 2,
         mew = 2,
         ms = 20)
plt.plot(np.arange(10) ** 2 + 20,
         'k-',
         marker = 's',
         mfc = 'none',
         lw = 2,
         mew = 2,
         ms = 20)
plt.show()

是的,它有点像一个hack。@tom10的解决方案更好 :) - daedalus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接