Python 有条件地移动饼图中单个数据标签的位置
以下示例代码将生成我将用作示例的圆环图:Python 有条件地移动饼图中单个数据标签的位置,python,matplotlib,Python,Matplotlib,以下示例代码将生成我将用作示例的圆环图: import matplotlib.pyplot as plt %matplotlib inline # Following should supposedly set the font correctly: plt.rcParams['font.family'] = 'sans-serif' plt.rcParams['font.sans-serif'] = ['Muli'] + plt.rcParams['font.sans-serif'] plt
import matplotlib.pyplot as plt
%matplotlib inline
# Following should supposedly set the font correctly:
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = ['Muli'] + plt.rcParams['font.sans-serif']
plt.rcParams['font.weight'] = 'extra bold'
size_of_groups=[12,11,30,0.3]
colors = ['#a1daaa','#bbbbb4','#444511','#1afff2']
import matplotlib as mpl
mpl.rcParams['text.color'] = '#273859'
# Create a pieplot
my_pie,texts,_ = plt.pie(size_of_groups,radius = 1.2,colors=colors,autopct="%.1f%%",
textprops = {'color':'w',
'size':15 #, 'weight':"extra bold"
}, pctdistance=0.75, labeldistance=0.7) #pctdistance and labeldistance change label positions.
labels=['High','Low','Normal','NA']
plt.legend(my_pie,labels,loc='lower center',ncol=2,bbox_to_anchor=(0.5, -0.2))
plt.setp(my_pie, width=0.6, edgecolor='white')
fig1 = plt.gcf()
fig1.show()
上述结果如下:
大多数情况下,这是伟大的。最后我得到了一个好看的甜甜圈图表
但是还有最后一件事需要处理——当甜甜圈图表的部分非常小(比如0.6%)时,我需要将标签从图表中移出,并可能改为黑色
我设法用plt.text为条形图做了类似的事情,但我认为这在饼图上根本不可行。我想以前肯定有人解决过类似的问题,但我不能轻易找到合适的解决方案。这里有一种方法,可以移动小于给定数量(代码示例中为5度)的补丁的所有百分比文本。请注意,当多个小部件彼此靠近时,此操作也会失败
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
size_of_groups = [12, 11, 30, 0.3]
colors = ['#a1daaa', '#bbbbb4', '#444511', '#1afff2']
my_pie, texts, pct_txts = plt.pie(size_of_groups, radius=1.2, colors=colors, autopct="%.1f%%",
textprops={'color': 'w', 'size': 15}, pctdistance=0.75,
labeldistance=0.7)
labels = ['High', 'Low', 'Normal', 'NA']
plt.legend(my_pie, labels, loc='lower center', ncol=2, bbox_to_anchor=(0.5, -0.2))
plt.setp(my_pie, width=0.6, edgecolor='white')
for patch, txt in zip(my_pie, pct_txts):
if (patch.theta2 - patch.theta1) <= 5:
# the angle at which the text is normally located
angle = (patch.theta2 + patch.theta1) / 2.
# new distance to the pie center
x = patch.r * 1.2 * np.cos(angle * np.pi / 180)
y = patch.r * 1.2 * np.sin(angle * np.pi / 180)
# move text to new position
txt.set_position((x, y))
txt.set_color('black')
plt.tight_layout()
plt.show()
导入matplotlib.pyplot作为plt
将matplotlib导入为mpl
将numpy作为np导入
组的大小=[12,11,30,0.3]
颜色=['#a1daaa'、'#bbbbb4'、'#444511'、'#1aff2']
my_pie,text,pct_txts=plt.pie(组的大小,半径=1.2,颜色=颜色,autoct=“.1f%%”,
textprops={'color':'w','size':15},pctdistance=0.75,
labeldistance=0.7)
标签=['High'、'Low'、'Normal'、'NA']
plt.图例(我的饼图,标签,loc='下中心',ncol=2,bbox'U到锚=(0.5,-0.2))
plt.setp(我的馅饼,宽度=0.6,边色=白色)
对于补丁,zip中的txt(my_pie,pct_txts):
如果(patch.theta2-patch.theta1)这里有一种方法可以移动小于某个给定量(代码示例中为5度)的补丁的所有百分比文本。请注意,当多个小部件彼此靠近时,此操作也会失败
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
size_of_groups = [12, 11, 30, 0.3]
colors = ['#a1daaa', '#bbbbb4', '#444511', '#1afff2']
my_pie, texts, pct_txts = plt.pie(size_of_groups, radius=1.2, colors=colors, autopct="%.1f%%",
textprops={'color': 'w', 'size': 15}, pctdistance=0.75,
labeldistance=0.7)
labels = ['High', 'Low', 'Normal', 'NA']
plt.legend(my_pie, labels, loc='lower center', ncol=2, bbox_to_anchor=(0.5, -0.2))
plt.setp(my_pie, width=0.6, edgecolor='white')
for patch, txt in zip(my_pie, pct_txts):
if (patch.theta2 - patch.theta1) <= 5:
# the angle at which the text is normally located
angle = (patch.theta2 + patch.theta1) / 2.
# new distance to the pie center
x = patch.r * 1.2 * np.cos(angle * np.pi / 180)
y = patch.r * 1.2 * np.sin(angle * np.pi / 180)
# move text to new position
txt.set_position((x, y))
txt.set_color('black')
plt.tight_layout()
plt.show()
导入matplotlib.pyplot作为plt
将matplotlib导入为mpl
将numpy作为np导入
组的大小=[12,11,30,0.3]
颜色=['#a1daaa'、'#bbbbb4'、'#444511'、'#1aff2']
my_pie,text,pct_txts=plt.pie(组的大小,半径=1.2,颜色=颜色,autoct=“.1f%%”,
textprops={'color':'w','size':15},pctdistance=0.75,
labeldistance=0.7)
标签=['High'、'Low'、'Normal'、'NA']
plt.图例(我的饼图,标签,loc='下中心',ncol=2,bbox'U到锚=(0.5,-0.2))
plt.setp(我的馅饼,宽度=0.6,边色=白色)
对于补丁,zip中的txt(my_pie,pct_txts):
如果(patch.theta2-patch.theta1)我试图通过在给定的不同问题上调整的解决方案来解决问题。由于某些原因,我的系统中没有显示百分号,但您可以找到答案
rad = 1.2 # Define a radius variable for later use
my_pie, texts, autotexts = plt.pie(size_of_groups, radius=rad, colors=colors, autopct="%.1f%%",
pctdistance=0.75, labeldistance=0.7, textprops={'color':'white', 'size':20})
# Rest of the code
cx, cy = 0, 0 # Center of the pie chart
for t in autotexts:
x, y = t.get_position()
text = t.get_text()
if float(text.strip('%')) < 1: # Here 1 is the target threshold percentage
angle = np.arctan2(y-cy, x-cx)
xt, yt = 1.1*rad*np.cos(angle)+cx, 1.1*rad*np.sin(angle)+cy
t.set_color("k")
t.set_position((xt,yt))
rad=1.2#定义一个半径变量供以后使用
my_pie,text,autotexts=plt.pie(组的大小,半径=rad,颜色=colors,autoct=“%.1f%%”,
pctdistance=0.75,labeldistance=0.7,textprops={'color':'white','size':20})
#代码的其余部分
cx,cy=0,0#饼图的中心
对于自动排版中的t:
x、 y=t.获得位置()
text=t.get_text()
如果float(text.strip('%'))<1:#这里1是目标阈值百分比
角度=np.arctan2(y-cy,x-cx)
xt,yt=1.1*rad*np.cos(角度)+cx,1.1*rad*np.sin(角度)+cy
t、 设置颜色(“k”)
t、 设置位置((xt,yt))
我试图通过在给定的不同问题上调整的解决方案来解决问题。由于某些原因,我的系统中没有显示百分号,但您可以找到答案
rad = 1.2 # Define a radius variable for later use
my_pie, texts, autotexts = plt.pie(size_of_groups, radius=rad, colors=colors, autopct="%.1f%%",
pctdistance=0.75, labeldistance=0.7, textprops={'color':'white', 'size':20})
# Rest of the code
cx, cy = 0, 0 # Center of the pie chart
for t in autotexts:
x, y = t.get_position()
text = t.get_text()
if float(text.strip('%')) < 1: # Here 1 is the target threshold percentage
angle = np.arctan2(y-cy, x-cx)
xt, yt = 1.1*rad*np.cos(angle)+cx, 1.1*rad*np.sin(angle)+cy
t.set_color("k")
t.set_position((xt,yt))
rad=1.2#定义一个半径变量供以后使用
my_pie,text,autotexts=plt.pie(组的大小,半径=rad,颜色=colors,autoct=“%.1f%%”,
pctdistance=0.75,labeldistance=0.7,textprops={'color':'white','size':20})
#代码的其余部分
cx,cy=0,0#饼图的中心
对于自动排版中的t:
x、 y=t.获得位置()
text=t.get_text()
如果float(text.strip('%'))<1:#这里1是目标阈值百分比
角度=np.arctan2(y-cy,x-cx)
xt,yt=1.1*rad*np.cos(角度)+cx,1.1*rad*np.sin(角度)+cy
t、 设置颜色(“k”)
t、 设置位置((xt,yt))
提出了一些解决问题的替代方案。提出了一些解决这个问题的方法。我再一次低着下巴坐在这里,想知道“他怎么会知道这一点”。非常感谢。再一次,我低着下巴坐在这里,想“他怎么会知道这件事?”。非常感谢你。