绘制水平轴以进行尺寸比较

时间:2016-02-01 12:14:26

标签: python matplotlib plot

我有一个元组(itemname, size)的集合,并希望在水平轴上可视化它们的大小,这是一个对数缩放。理想情况下,一条线会将显示itemname的标签连接到轴上代表size的x坐标。标签应该很好地排列在轴的一侧或两侧。

我有什么选择用Python绘制它?

这是我根据你的建议提出的:

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

for i, (name, radius) in enumerate(objects):
    sgn = 2 * (i % 2) - 1
    ax.annotate(name, xy=(radius,0), xytext=(radius,sgn* (0.5 + random.randint(1,12) * 0.1)), ha='center',
                arrowprops=dict(arrowstyle="->", connectionstyle="arc,angleA=0,armA=30,rad=30", facecolor='gray'),
               color="Maroon")
ax.set_xscale('log')
ax.set_xlim(1.e1,1.e15)
ax.set_ylim(0,4)
ax.axes.get_yaxis().set_visible(False)
ax.axhline(color='k', lw=1)
ax.plot([obj[1] for obj in objects], [0]*len(objects), 'ob', markersize=2)
ax.set_yticks([])
ax.tick_params(length=8)
ax.set_xlabel('edges')
seaborn.despine()
plt.show()

enter image description here

如果我可以隐藏y轴,那就完成了。添加fig.axes[0].get_yaxis().set_visible(False)无效。

1 个答案:

答案 0 :(得分:2)

这是你可以试用annotate的东西,虽然外观可以稍微调整一下。为了阻止标签重叠,我只需将它们放在x轴的交替两侧,但根据您的数据,您可能需要更复杂的东西。

import matplotlib.pyplot as plt

objects = [ ('Earth', 6.371e6),
            ('Jupiter', 6.9911e7),
            ('Sun', 6.96e8),
            ('Pollux', 5.568e9),
            ('Arcturus', 1.789e10),
            ('Aldebaran', 3.076e10),
            ('Antares', 6.14568e11)
          ]

fig, ax = plt.subplots()

for i, (name, radius) in enumerate(objects):
    sgn = 2 * (i % 2) - 1
    ax.annotate(name, xy=(radius,0), xytext=(radius,sgn*1), ha='center',
                arrowprops=dict(facecolor='black', shrink=0.05),)

ax.set_xscale('log')
ax.set_xlim(1.e6,1.e12)
ax.set_ylim(-2,2)

ax.axhline(color='k', lw=3)
ax.plot([obj[1] for obj in objects], [0]*len(objects), 'or', markersize=10)
ax.set_yticks([])
ax.set_xlabel('Radius /m')
plt.show()

enter image description here