我有一个元组(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()
如果我可以隐藏y轴,那就完成了。添加fig.axes[0].get_yaxis().set_visible(False)
无效。
答案 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()