Matplotlib 2.1.0:如何为所有柱状图应用虚线边框样式?
解决Matplotlib 2.1.0中柱状图仅第一个柱子生效虚线边框的问题
嘿,这个坑我之前踩过!在Matplotlib 2.1.0这个旧版本里,直接给ax.bar()传递ls='--'、ec='r'这类边框样式参数,确实会出现只有第一个柱子生效的bug。别担心,下面两种方法可以轻松解决:
方法1:遍历每个柱子补丁设置样式
ax.bar()会返回一个包含所有柱子补丁(patches)的BarContainer对象,我们可以遍历这个对象里的每个柱子,单独设置边框样式:
import matplotlib.pyplot as plt fig, ax = plt.subplots(1, 1) # 先绘制柱状图,保存返回的柱子容器 bars = ax.bar([1, 2, 3, 4], [10, 20, 15, 13]) # 遍历每个柱子,逐一设置边框样式 for bar in bars: bar.set_linestyle('--') # 设置虚线样式 bar.set_edgecolor('r') # 设置边框颜色为红色 bar.set_linewidth(5) # 设置边框宽度 plt.show()
方法2:通过参数列表批量设置(可选)
如果你不想写循环,也可以给edgecolor、linestyle等参数传入对应长度的列表(和柱子数量一致),不过这个方法在部分旧版本里兼容性不如第一种稳妥:
import matplotlib.pyplot as plt fig, ax = plt.subplots(1, 1) # 给每个柱子传入相同的边框参数 ax.bar( [1, 2, 3, 4], [10, 20, 15, 13], ls=['--']*4, ec=['r']*4, lw=[5]*4 ) plt.show()
为什么会出现这个问题?
在Matplotlib 2.1.0版本中,bar()方法的边框样式参数存在一个小bug:当传递单一值而非列表时,这些样式只会被应用到第一个柱子上,后续柱子无法正确继承。而通过直接操作每个柱子的补丁对象,就能绕过这个参数传递的问题,确保所有柱子都能应用上你想要的样式。
内容的提问来源于stack exchange,提问作者Rvndr Singh
相关产品推荐
相关产品推荐

