You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python-pptx:按值自定义条形图颜色(负值显示异常)求助

Python-pptx Bar Chart: Negative Values Not Showing Custom Color in Mac PowerPoint 15.36

我之前也碰到过类似的兼容性问题,尤其是旧版Mac PowerPoint和python-pptx搭配时容易出现这类奇怪的渲染bug。下面梳理你的问题、可行的解决思路和临时方案:

问题复现

你的代码逻辑本身没问题:给条形图的正负数据点分别设置红色和绿色,但生成的PPT里出现了异常:

  • 正值能正常显示自定义的绿色
  • 负值设置自定义红色后显示为白色框,只有使用主题默认色时才正常
  • 手动多次切换series.invert_if_negative对应的复选框后,颜色才会正确显示

环境信息

  • Python-pptx版本:0.6.7
  • Mac PowerPoint版本:15.36

已验证的临时解决方案

你提到的图案填充 workaround 确实能绕过这个渲染bug,具体调整后的代码如下:

from pptx import Presentation
from pptx.chart.data import ChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Cm
from pptx.dml.color import RGBColor
from pptx.enum.dml import MSO_PATTERN_TYPE

_red = RGBColor(255, 0, 0)
_green = RGBColor(0, 128, 0)

# 创建带1张幻灯片的演示文稿 ------
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])
x = ['one','two','three', 'four']
y = [-257.0, 1920.0, 2809.0, 500.0]
specs = {
    'height': Cm(7.82),
    'width': Cm(14.8),
    'left': Cm(2.53),
    'top': Cm(5.72)
}
data = ChartData()
data.categories = x
label_values = tuple(y)
data.add_series('Series 1', label_values)
frame = slide.shapes.add_chart(XL_CHART_TYPE.BAR_CLUSTERED, specs['left'],specs['top'], specs['width'],specs['height'], data)
chart = frame.chart
series = chart.series[0]

for i in range(len(y)):
    point = series.points[i]
    fill = point.format.fill
    # 使用纯色图案填充,前后色一致模拟纯色效果
    fill.patterned(MSO_PATTERN_TYPE.SOLID)
    target_color = _red if y[i]<0 else _green
    fill.fore_color.rgb = target_color
    fill.back_color.rgb = target_color

series.invert_if_negative = False
prs.save('chart-01.pptx')

这里用MSO_PATTERN_TYPE.SOLID图案填充,将前景色和背景色设为相同值,就能让正负值都显示正确的自定义颜色,不需要手动调整PPT的复选框。

可能的根因分析

这个问题大概率是Mac PowerPoint 15.36的渲染bug:旧版Office for Mac对python-pptx生成的图表纯色填充属性解析存在逻辑漏洞,尤其是当invert_if_negative设为False时,负值的纯色填充会被错误渲染为白色。而图案填充的属性结构和纯色填充不同,刚好绕过了这个解析漏洞。

另外,python-pptx 0.6.7是比较旧的版本(当前最新稳定版为0.6.23),如果有条件可以尝试升级到最新版,新版本修复了不少图表相关的兼容性问题,说不定能直接解决这个问题。

内容的提问来源于stack exchange,提问作者Ludo

火山引擎 最新活动