首页 文章

改进子图中饼图上的标签

提问于
浏览
3

我正在绘制一个包含三个子图的图:

fig = plt.figure(fignum)
ax11 = plt.subplot2grid((2,2), (0,0))
ax12 = plt.subplot2grid((2,2), (0,1))
ax13 = plt.subplot2grid((2,2), (1,0), colspan=2)
ax13.axis('off')

我正在使用Pandas作为我的数据,我想绘制条形图,饼图和表格 . 我这样做:

d = pd.Series(data,index)

#plotting the first subplot
d.plot(kind='bar',ax=ax11)

#plotting the second one and adjusting size of labels and percentages
(wedges, texts, autotexts) = ax12.pie(d,labels=d.index,autopct='%1.1f%%')
ax12.axis('equal')
for t in texts:
        t.set_size(7)
for t in autotexts:
        t.set_size(7)

#plotting the third axes, the table
ax13.table(cellText=table,colLabels=columns,loc='bottom')

结果如下:

enter image description here

如何通过不重叠标签使饼图看起来更好?我已经尝试添加一个图例,但它覆盖了图表,我甚至不知道它是否在我指定的位置结束:

ax12.legend(index,loc='lower right',fontsize=7)

enter image description here

有没有办法将图例向下移动到饼图下的空白区域?一旦图例看起来不错,我将从饼图中删除标签 .

1 回答

  • 1

    bbox_to_anchor 允许您将图例放置在图形的画布上 .

    见:http://matplotlib.org/users/legend_guide.html

    import matplotlib.pyplot as plt
    import pandas 
    
    fig = plt.figure()
    ax11 = plt.subplot2grid((2,2), (0,0))
    ax11.bar([1,2,3,4,3,2,1],[1,2,3,4,3,2,1])
    ax11.set_xticklabels(["local user","whetever works","L'ours tourne","en rond","dans sa cage",2,1], rotation="vertical")
    
    ax12 = plt.subplot2grid((2,2), (0,1))
    ax12.pie( [10,20,30,5,5,6,4,10,10], labels = ["bewarfefvl","easdfgvagfvd","asasdfve.sd","rgdegaf","adfewga","qargw","qaerghrttw","errrrd","ejjjjd"],autopct='%1.1f%%')
    ax12.axis('equal')
    ax12.legend(loc='lower right',fontsize=7, bbox_to_anchor = (0.75, -01.0) )
    
    
    ax13 = plt.subplot2grid((2,2), (1,0), colspan=2)
    ax13.axis('off')
    
    plt.show()
    

    虽然您可以通过调整它来跳过图例并提高饼图的可读性 . 我可以想到三种方法,但这绝不是一个详尽的清单:

    • 将列表作为参数传递时,可以通过交换列表中值的顺序来影响图表中每个切片的相对位置,以避免小切片簇 . 有可能在 pandas 中实现这一目标 .

    • labeldistance 允许您控制标签到图表的距离 .

    • 将第二个数组作为 explode 参数传递,可以偏移每个切片的位置 .

    一个简单的例子如下:

    ax12 = plt.subplot2grid((2,2), (0,1))
    labels = ["bewarfefvl","easdfgvagfvd","asasdfve.sd",
                  "rgdegaf","adfewga","qargw","qaerghrttw","errrrd","ejjjjd"]
    ax12.pie( [10,20,30,5,5,6,4,10,10], [0,0,0.0,0.1,0.3,.5,0,0,0], 
                              labels = labels, labeldistance=1.2)
    

相关问题