繁体   English   中英

根据值灵活分配图表栏颜色-python-pptx

[英]Flexibly assign chart bar color according to value - python-pptx

已经提出了类似的问题,但是尽管多次尝试,我仍然无法使它正常工作。 Python PPTX条形图的负值特定于颜色的条形图在Python PPTX中有所不同

这是一个简单的示例:

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

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

# create presentation with 1 slide ------
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(0,len(y)):
    point = series.points[i]
    fill = point.format.fill
    fill.solid()
    fill.fore_color.rgb = _red if y[i]<0 else _green
series.invert_if_negative = False

prs.save('chart-01.pptx')

我想要的是

我得到什么

我尝试了许多不同的配置。 Python-pptx之所以有效,是因为通过在我的代码中使用series.invert_if_negative将boolean设置为true或false,当我打开powerpoint演示文稿时,该复选框相应地起作用,如第二幅图所示。 仅在演示文稿生成后几次手动切换时,它才能在Powerpoint中正确显示。 我尝试更改该语句的位置,将其设置为true或false,甚至让它交替多次,然后再设置为false。

有趣的是,这仅在负条形图中发生,即,正值时我可以根据需要更改颜色。 即使所有值均为负。 我不能将它们全部设置为某种颜色。 它们唯一具有颜色并且不会显示为白框的时间是我完全不尝试更改其颜色并且它们默认为演示文稿主题颜色时。

我怀疑这是一个PowerPoint问题,而不是pptx-python问题,但是解决该问题的任何帮助将不胜感激!

Powerpoint版本:Mac上的15.36 Python-pptx版本:0.6.7

感谢令人惊叹的Scanny库以及您对所有其他问题的回答。 一直有很多帮助。

======= ======= UPDATE

解决此问题的方法是使用带图案的填充并将back_color和fore_color都设置为相同的颜色以获得相同的效果。

这可能是python-pptx生成的默认XML与PowerPoint生成(然后解释)的默认XML之间的差异。

首先,请检查您的版本,以确保您使用的是最新版本。 一段时间以前,有几次PowerPoint不c:invertIfNegative规范中规定的默认值,例如c:invertIfNegative默认值为True。 我们添加了一些代码来修复这些问题。

这是您的代码的一些调整:

chart = slide.shapes.add_chart(
    XL_CHART_TYPE.BAR_CLUSTERED, specs['left'], specs['top'], 
    specs['width'], specs['height'], data
).chart
series = chart.series[0]
series.invert_if_negative = False

for idx, point in enumerate(series.points):
    fill = point.format.fill
    fill.solid()
    fill.fore_color.rgb = _red if y[idx]<0 else _green

print(series._element.xml)

prs.save('chart-01.pptx')

我认为这不会解决任何问题,但是也许可以使意图更清晰一些,并且大多数情况下会打印出该系列的XML。 例如,您可以在设置反转选项之前和之后移动该行。

您在XML中寻找的是像<c:invertIfNegative val=0>这样的元素。 如果它不存在或具有其他价值,那将解释一些事情。

负值上的“白色”颜色更确切地说是“无颜色”,现在我想到这可能是因为没有设置背景颜色。 合理地假设“反转”时PowerPoint交换前景和背景。 因此,可以尝试的一件事是为负片而不是前景设置背景色,看看是否有任何有趣的事情。

如果您无法解决此问题,建议您在GitHub问题列表上为python-pptx打开一个问题,在这里我们可以使用会话模式而不是这里的问答格式来更好地研究它。

还没有安装pptx模块,所以我无法测试我的答案。 但是我可以看到您的if语句格式不正确。

尝试这个:

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

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

# create presentation with 1 slide ------
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(0,len(y)):
    point = series.points[i]
    fill = point.format.fill
    fill.solid()
    if y[i]<0:
        fill.fore_color.rgb = _red  
    else:
        fill.fore_color.rgb = _green
series.invert_if_negative = False

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM