调用ax.axes.lines.set_xdata移动误差棒帽后消失,如何解决?
问题
尝试将柱状图(bar)和误差棒(error bar)移动到刻度标记(tickmark)中心:通过ax.axes.patches遍历柱子,用bar.set_x(current_pos+(current_width))移动柱子;用ax.axes.lines[0].set_xdata(current_pos+(current_width*1.5))移动误差棒竖线。但调用ax.axes.lines[2].set_xdata(current_pos+(current_width*1.5))移动误差棒上帽时,该帽消失。
相关代码:
import matplotlib.pyplot as plt import numpy as np import seaborn as sns %matplotlib inline df = sns.load_dataset("penguins") ax = sns.barplot(data=df, x="island", y="body_mass_g", ci = "sd", capsize = 0.2, hue = "species") for i, bar in enumerate(ax.axes.patches): # move the bar to the centre current_width = bar.get_width() current_pos = bar.get_x() if i == 0: #move bar bar.set_x(current_pos+(current_width)) #change color and move error bar ax.axes.lines[0].set_color("red") ax.axes.lines[0].set_xdata(current_pos+(current_width*1.5)) #change color of error bar upper cap ax.axes.lines[2].set_color("red") #change position of error bar upper cap ax.axes.lines[2].set_xdata(current_pos+(current_width*1.5)) plt.show();
解决方案
误差棒的上帽是一条水平线,它的x数据包含左右两个端点值。直接把xdata设置为单个数值时,这条线会收缩成一个点,自然看不见。正确的做法是保持两个端点,将整体平移到目标位置:
- 获取原误差棒帽的x数据,计算帽的半宽(
cap_half_width) - 计算新的中心x坐标(
new_x) - 将帽的x数据设置为
[new_x - cap_half_width, new_x + cap_half_width]
修改后的代码:
import matplotlib.pyplot as plt import numpy as np import seaborn as sns %matplotlib inline df = sns.load_dataset("penguins") ax = sns.barplot(data=df, x="island", y="body_mass_g", ci = "sd", capsize = 0.2, hue = "species") for i, bar in enumerate(ax.axes.patches): current_width = bar.get_width() current_pos = bar.get_x() if i == 0: # 移动柱子到中心 bar.set_x(current_pos + current_width) # 移动并修改误差棒竖线 new_x = current_pos + current_width * 1.5 ax.axes.lines[0].set_color("red") ax.axes.lines[0].set_xdata(new_x) # 修改误差棒上帽颜色并移动 upper_cap = ax.axes.lines[2] upper_cap.set_color("red") # 获取原帽的半宽 cap_half_width = (upper_cap.get_xdata()[1] - upper_cap.get_xdata()[0]) / 2 # 设置新的帽x坐标,保持宽度 upper_cap.set_xdata([new_x - cap_half_width, new_x + cap_half_width]) # 同理处理下帽 lower_cap = ax.axes.lines[1] lower_cap.set_color("red") lower_cap.set_xdata([new_x - cap_half_width, new_x + cap_half_width]) plt.show();
注意:ax.axes.lines中的元素顺序对应每个误差棒的竖线、下帽、上帽。如果要处理多组数据,需要更精准地匹配柱子和对应的误差棒,避免操作错误的线条。
内容的提问来源于stack exchange,提问作者Pisut Yosbantueng
相关产品推荐
相关产品推荐

