gpt4 book ai didi

python - 如何避免饼图标签在 MatPlotLib ver.2.0.2 中重叠?

转载 作者:行者123 更新时间:2023-11-28 17:13:32 24 4
gpt4 key购买 nike

关于饼图绘图的标签重叠,有很多问题。但是,除了将它们转换为图异常(exception),我找不到自动化解决方案。这个解决方案对我不起作用,因为我有很多值(大约 60),并且转换为图例会使情节看起来非常困惑和不清楚。所以我的问题是,如果我想在饼图周围标记饼图楔形,MatPlotLib 2.0.2 版是否有任何自动化解决方案可以使标签具有良好的间距(无重叠)?我找到的唯一解决方案是使用 annotation() 手动完成。请参阅下面带有虚拟值的脚本。也可以用箭头将饼图的楔形连接到相关标签吗?

我使用 Python 2.7 和 MatPlotLib 2.0.2

谢谢,

示例 1(重叠标签)

enter image description here

示例2(手动更正)

enter image description here

import pylab 
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
l = ax.pie([1,0.2, 0.3,0.1,0.4,7,50,35,5,2],#[0, 0.1, 0, 0.1,0,0.1,0,0.1,0,0.1],
#labels=("one","two","three made up sentences","four is also ther","five becomes a sentence","six it is","seven long", "eight long sent", "nine, as bla bel mo","ten is also short"),
labels=("","","","","","six it is","seven long", "eight long sent", "nine, as bla bel mo","ten is also short"),
colors=("b","g","r","y", "b","g","r","y","g","black"),
startangle =20,
radius=1,
frame=True, # Plot axes frame with the chart if true.
labeldistance = 1.1 ) #returns a list of matplotlib.patches.Wedge objects

l2 = ax.pie([1,0.2, 0.3,0.1,0.4,7,50,35,5,2],#[0, 0.1, 0, 0.1,0,0.1,0,0.1,0,0.1],
colors=("r","g","b","w", "g","b","y","r","w","black"),
startangle =20,
radius=1-0.7,
frame=True) # Plot axes frame with the chart if true.

coor = [t.get_position() for t in l[1]]

ax.axis('equal')
plt.annotate( 'one was very short now ext', xy= (coor[0][0], coor[0][1]) ) # https://kite.com/docs/python/matplotlib.pyplot.annotate
plt.annotate( 'two long sentense', xy= (coor[1][0], coor[1][1]) )
plt.annotate('three things to say' , xy= (coor[2][0], coor[2][1]+0.02) )
plt.annotate( 'four main tasks to do', xy= (coor[3][0], coor[3][1]+0.04) )
plt.annotate( 'five reasons to avoid', xy= (coor[4][0], coor[4][1]+0.06 ))

plt.savefig('test_draft.pdf')
plt.show()

最佳答案

您可以尝试旋转文本。下面确定每个楔形的角度,然后相应地旋转注释文本。需要根据角度进行一些额外的调整,以确定文本对齐方式,并确保文本不会上下颠倒。您可能需要进一步完善它。

import pylab 
import matplotlib.pyplot as plt
import math

fig, ax = plt.subplots()

labels= [
"one",
"two",
"three made up sentences",
"four is also there",
"five becomes a sentence",
"six it is",
"seven long",
"eight long sent",
"nine, as bla bel mo",
"ten is also short"]

l = ax.pie([1,0.2, 0.3,0.1,0.4,7,50,35,5,2],
labels=[''] * len(labels),
colors=("b","g","r","y", "b","g","r","y","g","black"),
startangle=20,
radius=1,
frame=True, # Plot axes frame with the chart if true.
labeldistance=1.1) #returns a list of matplotlib.patches.Wedge objects

l2 = ax.pie([1,0.2, 0.3,0.1,0.4,7,50,35,5,2],#[0, 0.1, 0, 0.1,0,0.1,0,0.1,0,0.1],
colors=("r","g","b","w", "g","b","y","r","w","black"),
startangle=20,
radius=1-0.7,
frame=True) # Plot axes frame with the chart if true.

for label, t in zip(labels, l[1]):
x, y = t.get_position()
angle = int(math.degrees(math.atan2(y, x)))
ha = "left"
va = "bottom"

if angle > 90:
angle -= 180

if angle < 0:
va = "top"

if -45 <= angle <= 0:
ha = "right"
va = "bottom"

plt.annotate(label, xy=(x,y), rotation=angle, ha=ha, va=va, size=8)

ax.axis('equal')
plt.show()

将显示为:

pie with rotated annotations

关于python - 如何避免饼图标签在 MatPlotLib ver.2.0.2 中重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45749738/

24 4 0