如何解决Matplotlib垂直时间轴图表中的标签重叠问题
解决Matplotlib垂直时间轴标签重叠问题
我常用的防止数据标签重叠的方法(比如autofmt_xdate)在Matplotlib垂直时间轴上不起作用。我不关心图表需要多高,也不在意项目间垂直距离是否完全保留日期间隔比例,只要求文本标签不重叠。
控制文本标签的核心代码如下:
_ = ax.text(label_offsets[i], d, l, ha=align, fontfamily='serif', fontweight='bold', color='royalblue',fontsize=12)
其中d是作为y轴坐标的时间戳。我尝试过创建循环计数器并存储每次循环的d值,对比当前与前一个日期,若间距过近则给当前d增加固定值(如15天),但未奏效。
完整绘图代码:
chartdata = pd.read_csv( "data/Events.csv" ) chartdata = chartdata.query('Year > 1939') dates = pd.to_datetime(chartdata['Date_Clean_Approx']) min_date = date(np.min(dates).year - 2, np.min(dates).month, np.min(dates).day) max_date = date(np.max(dates).year + 2, np.max(dates).month, np.max(dates).day) labels = chartdata['Name'] # labels with associated dates labels = ['{0:%d %b %Y}:\n{1}'.format(d, l) for l, d in zip (labels, dates)] fig, ax = plt.subplots(figsize=(6, 32), constrained_layout=True) _ = ax.set_xlim(-20, 20) _ = ax.set_ylim(min_date, max_date) _ = ax.axvline(0, ymin=0.05, ymax=0.95, c='deeppink', zorder=1) _ = ax.scatter(np.zeros(len(dates)), dates, s=120, c='palevioletred', zorder=2) _ = ax.scatter(np.zeros(len(dates)), dates, s=30, c='darkmagenta', zorder=3) label_offsets = np.repeat(2.0, len(dates)) label_offsets[1::2] = -2.0 for i, (l, d) in enumerate(zip(labels, dates)): d = d - timedelta(days=90) align = 'right' if i % 2 == 0: align = 'left' _ = ax.text(label_offsets[i], d, l, ha=align, fontfamily='serif', fontweight='bold', color='royalblue',fontsize=12) stems = np.repeat(2.0, len(dates)) stems[1::2] *= -1.0 x = ax.hlines(dates, 0, stems, color='darkmagenta') # hide lines around chart for spine in ["left", "top", "right", "bottom"]: _ = ax.spines[spine].set_visible(False) # hide tick labels _ = ax.set_xticks([]) _ = ax.set_yticks([]) _ = ax.set_title('UAP (UFO) Milestones, 1940 - Present', fontweight="bold", fontfamily='serif', fontsize=16, color='royalblue') pyplot(fig)
我已经增大图表高度以减少标签重叠,但图表变得很长仍存在文本重叠问题。如果能将“根据需要调整相对间距和图表高度以避免文本标签重叠”的逻辑嵌入Matplotlib的便捷绘图函数中,会是一个很实用的功能。
内容的提问来源于stack exchange,提问作者Hack-R
相关产品推荐
相关产品推荐

