2013-04-07 106 views
3

我想要标记,例如带+,或者x或者的空方块,或者里面有可调厚度的任何东西;实际上就像Origin中的那些。看起来它需要定制。matplotlib自定义标记

代码示例:

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() 

回答

6

使用text,您可以使用您的字体可用的任何字符。尽管你需要自己遍历它们,但我认为你不能持续控制它们的线宽(当然,如果可以的话,你可以选择'bold'等)。

enter image description here

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

+0

看起来不错,但这是一个可惜使用pyplot.text(),而不是pyplot.plot()来绘图。 – user1850133 2013-04-08 18:56:47

+0

您可以使用绘图(请参阅编辑),但由于某些原因我不理解,渲染效果并不理想。如果是我,我只需制作一个名为'plot_text'的函数来迭代'text'。 – tom10 2013-04-08 19:49:14

+0

我试过plt.plot(np.arange(10)** 2,marker = u'\ u2B21');它会返回一个错误消息:UnicodeEncodeError:'ascii'编解码器无法对位置0中的字符u'\ u2b21'进行编码:序号不在范围内(128) – user1850133 2013-04-14 17:45:16

3

这是你想要的吗?

Custom markers by overplotting

我这样做,通过由此overplotting:

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() 
+1

结果看起来不错,但我不喜欢你的解决方案! – user1850133 2013-04-08 18:52:46

+0

是的,这是一个黑客。 @ tom10的解决方案是更好:) – gauden 2013-04-08 18:54:26