如何在曲线的两端获得带标签的matplotlib图?

时间:2018-06-07 04:04:35

标签: python matplotlib

我正在尝试使用可用数据here复制此可用的地图here

seasonal

我能够做到这一点,至少可以说这有点混乱。

enter image description here

用于获取上述杂乱情节的代码是:

def season_plot():
#robjects.r['load']("./data/a10.rda")
#print(robjects.r['a10'])
#pandas2ri.activate()
#pydf = pd.DataFrame(robjects.r['a10'])
pydf = pd.read_csv('./data/a10.csv',header=None,names=['date','drug_sales'])
dtrng = pd.date_range("1991-07","2008-06",freq='MS')
pydf.set_index(dtrng, inplace=True)
pydf.drop('date', axis=1, inplace=True)
#print(pydf.tail())
pv = pd.pivot_table(pydf,
                index=pydf.index.month,
                columns=pydf.index.year,
                values='drug_sales',
                aggfunc='sum')
fig,ax = plt.subplots()
pv.plot(ax=ax,style='o-',legend=None)
#ax.margins(x=0.15)
for line, name in zip(ax.lines, pv.columns):
    first = line.get_ydata()[0]
    ax.annotate(name, xy=(0,first), xytext=(0,0),
                color=line.get_color(),
                xycoords = ax.get_yaxis_transform(),
                textcoords="offset points",
                size=10, va="center")
for line, name in zip(ax.lines, pv.columns):
    last = line.get_ydata()[-1]
    ax.annotate(name, xy=(1,last), xytext=(0,0),
                color=line.get_color(),
                xycoords = ax.get_yaxis_transform(),
                textcoords="offset points",
                size=10, va="center")

ax.xaxis.set_major_locator(plt.MaxNLocator(13))
xtks = ax.get_xticks().tolist()
xlabels = [calendar.month_abbr[int(x)] if x in range(1,13) else x \
           for x in xtks]
ax.set_xticklabels(xlabels)
plt.title('Antidiabetic drug sales')
plt.ylabel('$ million')
plt.show()

如何将年份标签整齐地排列在第一个图中描述的确切位置?

感谢。

1 个答案:

答案 0 :(得分:1)

如果没有一些示例数据,很难调试这些问题。对我来说,似乎有两个问题:

1)xy中变量annotate的x值似乎不正确,至少对于端点而言。终点xy应该类似于xy = line.get_xdata[-1], line.get_ydata[-1];虽然您对x值的0的猜测可能是正确的,但同样可以开始。

2)如果您不希望标签与数据重叠,则应将偏移点设置为xytext=(0,0)以外的其他值。如果您将(-5,0)分别设置为(5,0)horizontalalignment作为起点和终点,则'right''left'看起来应该不错。