饼图标签重叠相同的值。

时间:2014-04-15 10:23:44

标签: python matplotlib

这里我试图使用 matplotlib python库创建一个饼图。但如果值多次相同“0.0”,则日期重叠 我的问题是如何单独显示它们。

感谢。

enter image description here

这就是我的尝试:

from pylab import *

labels = [ "05-02-2014", "23-02-2014","07-02-2014","08-02-2014"]
values = [0, 0, 2, 10]
fig = plt.figure(figsize=(9.0, 6.10)) 
plt.pie(values, labels=labels, autopct='%1.1f%%', shadow=True)
plt.axis('equal')
show()

2 个答案:

答案 0 :(得分:6)

您可以手动调整标签位置,但这样可以为这样一个简单的请求提供更多代码。您可以通过检查放置的位置来检测重复标签组。

以下是一些复制重叠标签出现的随机数据的示例:

import matplotlib.pyplot as plt
import numpy as np
from collections import Counter
import datetime

# number slices of pie
num = 10

# generate some labels
dates = [datetime.datetime(2014,1,1) + datetime.timedelta(days=np.random.randint(1,20)) for i in range(num)]
labels = [d.strftime('%d-%m-%Y') for d in dates]

# generate some values
values = np.random.randint(2,10, num)

# force half of them to be zero
mask = np.random.choice(num, num // 2, replace=False)
values[mask] = 0

# pick some colors
colors = plt.cm.Blues(np.linspace(0,1,num))

fig, ax = plt.subplots(figsize=(9.0, 6.10), subplot_kw={'aspect': 1})
wedges, labels, pcts = ax.pie(values, colors=colors, labels=labels, autopct='%1.1f%%')


# find duplicate labels and the amount of duplicates
c = Counter([l.get_position() for l in labels])
dups = {key: val for key, val in c.items() if val > 1}

# degrees of spacing between duplicate labels
offset = np.deg2rad(3.)


# loop over any duplicate 'position'
for pos, n in dups.items():

    # select all labels with that position
    dup_labels = [l for l in labels if l.get_position() == pos]

    # calculate the angle with respect to the center of the pie
    theta = np.arctan2(pos[1], pos[0])

    # get the offsets
    offsets = np.linspace(-(n-1) * offset, (n-1) * offset, n)

    # loop over the duplicate labels
    for l, off in zip(dup_labels, offsets):

        lbl_radius = 1.3

        # calculate the new label positions
        newx = lbl_radius * np.cos(theta + off)
        newy = lbl_radius * np.sin(theta + off)

        l.set_position((newx, newy))

        # rotate the label
        rot = np.rad2deg(theta + off)

        # adjust the rotation so its
        # never upside-down
        if rot > 90:
            rot += 180
        elif rot < -90:
            rot += 180

        # rotate and highlight the adjusted labels
        l.set_rotation(rot)
        l.set_ha('center')
        l.set_color('#aa0000')

我故意仅修改重叠标签以突出显示效果,但您可以以类似的方式更改所有标签以创建统一样式。旋转可以更容易地自动分隔它们,但您可以尝试其他放置方式。

请注意,它只检测真正相同的展示位置,如果您的值为[0, 0.00001, 2, 10],它们可能仍会重叠。

enter image description here

答案 1 :(得分:1)

我不确定是否有办法调整&#34; labeldistance&#34;对于每个元素,但我可以用一种棘手的方法来解决这个问题。

我添加了爆炸(0,0.1,0,0)

from pylab import *

labels = [ "05-02-2014", "23-02-2014","07-02-2014","08-02-2014"]
values = [0, 0, 2, 10]
explode = (0, 0.1, 0, 0)
fig = plt.figure(figsize=(9.0, 6.10)) 
test=range(len(values))
patches,texts= plt.pie(values, explode=explode,labels=labels,  startangle=90,  radius=0.5 )#pctdistance=1.1,startangle=10, labeldistance=0.8,radius=0.5)



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

<强>更新 这与我合作,你应该更新pylab