2017-04-25 137 views
3

我知道,有可能通过手动设置他们改变轴标签。 (例如: - Modify tick label textMatplotlib:自动修改轴标签

然而,这显然只有当你知道你想要什么标签,这是不适合我的情况下工作。

这里是想什么,我要完成一个例子: 我有两个numpy的数组:x包含1和366之间的数字(但不一定是全部),较2016年“Y”天包含一些其他的号码。我想提出的散点图“Y”与“X”:

import numpy as np 
import matplotlib.pyplot as plt 
x = np.array([27, 38, 100, 300]) 
y = np.array([0.5, 2.5, 1.0, 0.8]) 
plt.scatter(x, y) 

毫不奇怪,这产生在0与蜱的图表,50,100,...,350我想将这些刻度标签更改为单独的日期。 (例如,在50刻度会被贴上类似“2月19日”)。假设我有一个函数tick_to_date一种能将数字0为日期字符串,所以它会是容易的,我手动更改所有的蜱我图形。 (如果您需要占位符功能:tick_to_date = lambda x: ("day " + str(x))

ax = plt.gca() 
ax.set_xticklabels([tick_to_date(tick.get_text()) for tick in ax.get_xticklabels()]) 

但是,这只能做一次。如果我现在放大,或进行改变蜱任何行动,新的刻度标记都不会是什么,我想他们是。

理想的情况下,而不是手动设置的标签,我会告诉轴线总是用我自己的tick_to_date功能改造刻度标记。另外,调用每次蜱改变时,上面一行代码,但我不知道会这么好。这些可能/可行/愉快可用吗?

回答

3

如果我真正了解你的问题,你是从matplotlib.ticker寻找function formatter

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib import ticker 

# I added 'y' to fit second argument (position) of FuncFormatter 
tick_to_date = lambda x,y: ("day " + str(x)) 

x = np.array([27, 38, 100, 300]) 
y = np.array([0.5, 2.5, 1.0, 0.8]) 
plt.scatter(x, y) 

ax = plt.gca() 
# tick_to_date will affect all tick labels through MyFormatter 
myFormatter = ticker.FuncFormatter(tick_to_date) 
# apply formatter for selected axis 
ax.xaxis.set_major_formatter(myFormatter) 
plt.show()