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

Python-PPTX:如何为XY散点图的单个图例项设置字体颜色?

Modifying Individual Legend Entry Font Colors in Python-PPTX XY Scatter Charts

Great question! I’ve dealt with this exact limitation before—Python-PPTX doesn’t offer a direct, high-level API for changing font colors of specific legend entries, but we can absolutely make it work by interacting with the underlying OpenXML structure of the presentation. Here’s a step-by-step solution:

How It Works

PPT charts store their legend configuration in XML, and each legend entry has its own text properties (including font color) embedded in that structure. We’ll access the chart’s raw XML via Python-PPTX’s _element attribute, locate the target legend entry, and modify its color directly.

Full Code Example

Let’s walk through creating a scatter chart and modifying one legend entry’s font color:

from pptx import Presentation
from pptx.chart.data import XyChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.oxml.ns import qn

# 1. Set up the presentation and slide
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[5])

# 2. Prepare XY scatter chart data
chart_data = XyChartData()
series1 = chart_data.add_series("Control Group")
series1.add_data_point(1.2, 3.4)
series1.add_data_point(2.5, 4.1)
series2 = chart_data.add_series("Test Group")
series2.add_data_point(3.1, 5.2)
series2.add_data_point(4.3, 6.8)

# 3. Add the scatter chart to the slide
x, y, cx, cy = 1, 1, 8, 5
chart = slide.shapes.add_chart(XL_CHART_TYPE.XY_SCATTER, x, y, cx, cy, chart_data).chart

# 4. Access the legend and its underlying XML
legend = chart.legend
legend_xml = legend._element

# 5. Iterate through legend entries to find and modify the target
for legend_entry in legend_xml.findall(qn('c:legendEntry')):
    # Get the text of the legend entry
    tx_pr = legend_entry.find(qn('c:txPr'))
    if not tx_pr:
        continue  # Skip entries without text properties
    text_runs = tx_pr.findall(qn('a:p/a:r/a:t'))
    if not text_runs:
        continue
    entry_text = text_runs[0].text

    # Target the "Test Group" entry to change its color to red
    if entry_text == "Test Group":
        # Locate or create the solid fill element for font color
        r_pr = tx_pr.find(qn('a:p/a:r/a:rPr'))
        solid_fill = r_pr.find(qn('a:solidFill'))
        if not solid_fill:
            solid_fill = r_pr.addnew(qn('a:solidFill'), '')
        
        # Set the RGB color (use RRGGBB hex format)
        srgb_clr = solid_fill.find(qn('a:srgbClr'))
        if not srgb_clr:
            srgb_clr = solid_fill.addnew(qn('a:srgbClr'), '')
        srgb_clr.set(qn('val'), 'FF0000')  # Red

# Save the modified presentation
prs.save('colored_legend_scatter.pptx')

Key Notes

  • Namespace Handling: We use the qn() function to properly reference XML elements with their PowerPoint-specific namespaces—this is critical to avoid missing elements.
  • Color Format: Colors are specified as 6-character hex strings in RRGGBB format (e.g., 0000FF for blue, FFFF00 for yellow).
  • Edge Cases: The code includes checks for missing elements (like entries without text) to prevent runtime errors, which is important if your chart has hidden or auto-generated legend entries.
  • Compatibility: This method works for most modern PowerPoint versions (2016+), as the OpenXML structure for charts is consistent across releases.

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

火山引擎 最新活动