使用 matplotlib 在对数刻度上居中注释

我有以下不言自明的情况;请参阅下面粘贴的图和工作示例。


我想知道如何在尺寸线的中间居中文本。


import numpy as np

import matplotlib.pyplot as plt


# Dimension line

def annotation_line(ax, xmin, xmax, y, text, ytext=0, linecolor='black', linewidth=1, fontsize=12):

    ax.annotate('', xy=(xmin, y), xytext=(xmax, y), xycoords='data', textcoords='data', arrowprops={'arrowstyle': '|-|', 'color':linecolor, 'linewidth':linewidth})

    ax.annotate('', xy=(xmin, y), xytext=(xmax, y), xycoords='data', textcoords='data', arrowprops={'arrowstyle': '<->', 'color':linecolor, 'linewidth':linewidth})

    xcenter = xmin + (xmax - xmin) / 2

    if ytext==0:

        ytext = y + ( ax.get_ylim()[1] - ax.get_ylim()[0] ) / 20

    ax.annotate(text, xy=(xcenter, ytext), ha='center', va='bottom', fontsize=fontsize)


# Toy data

N = 8

y = np.zeros(N)

x1 = np.linspace(1, 1000, N, endpoint=True)


fig, ax = plt.subplots(figsize=(10, 6))

ax.plot(x1, y, 'o')

annotation_line(ax=ax, text='TEXT 1', xmin=1, xmax=100, y=0.01, ytext=0, linewidth=1, linecolor='gray', fontsize=12)

ax.set_xscale('log')

http://img4.mukewang.com/636b68da00018ae906040363.jpg

神不在的星期二
浏览 165回答 1
1回答

www说

简单的解决方案是按照@JohanC 的建议进行操作并计算对数坐标的中点。另一种解决方案是使用箭头的坐标来找到它的中点。然而,这种方法也有缺点。首先,您需要在中间步骤显式绘制图形,因为坐标仅在绘制时有效,其次,您需要在绘制注释之前设置对数比例。另一方面,无论轴的缩放如何,代码都可以工作import numpy as npimport matplotlib.pyplot as plt# Dimension linedef annotation_line(ax, xmin, xmax, y, text, ytext=0, linecolor='black', linewidth=1, fontsize=12):&nbsp; &nbsp; an = ax.annotate('', xy=(xmin, y), xytext=(xmax, y), xycoords='data', textcoords='data', arrowprops={'arrowstyle': '|-|', 'color':linecolor, 'linewidth':linewidth})&nbsp; &nbsp; ax.annotate('', xy=(xmin, y), xytext=(xmax, y), xycoords='data', textcoords='data', arrowprops={'arrowstyle': '<->', 'color':linecolor, 'linewidth':linewidth})&nbsp; &nbsp; ax.figure.canvas.draw() # draw to get actual coordinates&nbsp; &nbsp; p = an.arrow_patch.get_path().transformed(ax.transAxes.inverted())&nbsp; &nbsp; xmin, xmax = np.min(p.vertices[:,0]),np.max(p.vertices[:,0])&nbsp; &nbsp; xcenter = xmin+(xmax-xmin)/2&nbsp; &nbsp; if ytext==0:&nbsp; &nbsp; &nbsp; &nbsp; ytext = y + ( ax.get_ylim()[1] - ax.get_ylim()[0] ) / 20&nbsp; &nbsp; ax.annotate(text, xy=(xcenter, ytext), xycoords=('axes fraction','data'), ha='center', va='bottom', fontsize=fontsize)&nbsp; &nbsp; return an# Toy dataN = 8y = np.zeros(N)x1 = np.linspace(1, 1000, N, endpoint=True)fig, ax = plt.subplots(figsize=(10, 6))ax.plot(x1, y, 'o')ax.set_xscale('log') # must do before the call to annotation_linean = annotation_line(ax=ax, text='TEXT 1', xmin=1, xmax=100, y=0.01, ytext=0, linewidth=1, linecolor='gray', fontsize=12)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python