当我使用Matplotlib绘制图形时,经常会遇到一些比例太小导致 百分比标签 以及 文本标签 重叠问题。这样的话非常影响美观,效果在BOSS心中的大打折扣。
代码如下:
from matplotlib import pyplot as plt frac = [0,0,18/50,16/50,9/50,6/50,2/50] label = ['[3,4]','(4,5]','(5,6]','(6,7]','(7,8]','(8,9]','(9,10]'] plt.pie(frac,labels=label,autopct="%.2f%%",textprops={"size":10},shadow=True) plt.show()
老Amy不甘示弱,遇到问题就是肝!首先,我们解决的思路是,使得重叠标签中,一个进行向上挪动一丢丢即可。
那问题是代码怎么来实现呢?
首先,我们需要了解到,plt.pie()
有多个返回值,参考官网如下:
oh no,那有的朋友会说全英文的谁知道在巴巴啥,于是翻译过来如下:
或者打印出来如下:
这样我们就明白了。所以第二步,我们需要考虑的是:如何取出我们需要的 文本对象 与 百分比对象 去设置距离。
了解到每个返回的数据类型实际上是 list
列表,而列表里面的每个元素就是图形中每个文本的对象。
所以,此时我们通过循环将重叠的元素取出来,而又因为构建绘图数据中,是索引为0与索引为1两个元素为0导致重叠。所以我们获取其中一个即可。
代码如下:
from matplotlib import pyplot as plt frac = [0,0,18/50,16/50,9/50,6/50,2/50] label = ['[3,4]','(4,5]','(5,6]','(6,7]','(7,8]','(8,9]','(9,10]'] patches,texts,autotexts = plt.pie(frac,labels=label,autopct="%.2f%%",textprops={"size":10},shadow=True) for i in range(len(autotexts)): if i == 0: print(texts[i]) print(autotexts[i]) plt.show()
那问题是,我们怎么去设置它的位置呢?因为matplotlib
关于设置的方法非常多,而我们并不主张记忆,更加主张时用时查。所以这个时候就需要借助我们的官网了。
查官网的第一步是需要知道,该数据是什么类型的对象,则使用type()
输出其类型。
print(type(texts[i])) print(type(autotexts[i]))
然后我们就去官网搜索matplotlib.text.Text
,定位:
ohohoh,至于这些英文就需要大家自己去看了,你懂的吧!所以接下来,我们来写代码解决我们的问题:
from matplotlib import pyplot as plt frac = [0,0,18/50,16/50,9/50,6/50,2/50] label = ['[3,4]','(4,5]','(5,6]','(6,7]','(7,8]','(8,9]','(9,10]'] patches,texts,autotexts = plt.pie(frac,labels=label,autopct="%.2f%%",textprops={"size":10},shadow=True) for i in range(len(autotexts)): if i == 0: print(texts[i].set_y(0.1)) print(autotexts[i].set_y(0.1)) plt.show()