首页 > 解决方案 > 更改堆积面积图中一个线段的透明度

问题描述

假设我有一些时间序列数据要显示,我希望查看者带走两件事:保证值 (y1) 和上限 (y2)。

我想通过堆积面积图显示它(使用 matplotlib,或者在下面的示例中,通过 pandas 包装器)。

import numpy as np
import matplotlib.pyplot as plt

# --- Define df ---
df = pd.DataFrame({
    'x':range(1,6),
    'y1':[1,4,6,8,9],
    'y2':[2,2,7,10,12]})

# --- Set xaxis as index ---
df.set_index('x', inplace=True)

# --- Plot using pandas ---
fig, ax = plt.subplots()
df.plot.area(ax=ax)

基线

为了表明 y2 是一个上限,我想在不触及 y1 的 alpha 的情况下降低 y2 的透明度(alpha)。因为该alpha参数不采用列表(即[1, 0.5]),所以我通常会通过直接访问这些行来执行此操作。

for line in fig.gca().lines:
   line.set_alpha(0.1)

然而,这并没有改变任何东西。我也试过这个也plt.stackplot()没有结果。

如何访问堆叠区域图中单个 y 值集的透明度?

标签: pythonpandasmatplotlibdata-visualization

解决方案


一种方法是在默认的 matplotlib 颜色循环(橙色)中获取第二种颜色的 RGBA 形式,并将其传递给df.plot. 修改后的可运行代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import to_rgba

# --- Define df ---
df = pd.DataFrame({
    'x':range(1,6),
    'y1':[1,4,6,8,9],
    'y2':[2,2,7,10,12]})

# --- Set xaxis as index ---
df.set_index('x', inplace=True)

# --- Get default orange, make it translucent  ---
default_colors = plt.rcParams['axes.prop_cycle'].by_key()['color']
# to_rgba returns a tuple; python tuples are immutable. 
# Convert to list in order to modify the last element (alpha channel)
new_orange = list(to_rgba(default_colors[1]))
# Change alpha channel from 1 to 0.2
new_orange[-1] = 0.2

# --- Plot using pandas ---
fig, ax = plt.subplots()
df.plot.area(ax=ax, color=['C0', new_orange])

原答案如下

这是一个脆弱的解决方案,仅适用于您的特定绘图顺序:获取轴的子元素列表,然后更改第二个子元素(橙色多边形)和第四个子元素(橙色线)的 alpha 值。在现有代码之后运行它:

# --- Reduce alpha of orange polygon and line ---
children = ax.get_children()    
children[1].set_alpha(0.2)
children[3].set_alpha(0.2)

修改后的情节


推荐阅读