首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Matplotlib中与透明层相交的正确图例颜色

Matplotlib中与透明层相交的正确图例颜色
EN

Stack Overflow用户
提问于 2017-02-20 14:25:53
回答 1查看 1.6K关注 0票数 2

我经常需要在一个简洁的图中指出一些数据的分布情况,如下图所示。我通过绘制几个fill_between区域来实现这一点,这些区域受到分布的分位数的限制。

代码语言:javascript
运行
复制
ax.fill_between(x, quantile1, quantile2, alpha=0.2)

在for循环中,我通过计算分位数1和2(如图例所示)生成这样的图: 0%到100%分位数,然后10%到90%等等,每个fill_between在前一个“层”的顶部绘制。

这是带有三层透明颜色以及中线(0.5)的输出:

然而,传说中的颜色并不是我想要的那样,因为它们(自然)使用每一层的颜色,没有考虑到几层的综合效果。

代码语言:javascript
运行
复制
ax.legend([0.5]+[['0.0%', '100.0%'], ['10.0%', '90.0%'], ['30.0%', '70.0%']])

在图例命令中覆盖面部颜色值的最佳方法是什么?

我想避免这样做,首先用0%至10%的透明度"0.2",然后再用10%至30%的透明度"0.4“等等,因为这将需要两倍的时间计算,使代码更加复杂。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-20 15:59:22

您可以使用代理艺术家在图例中放置与从情节中得到的结果完全相同的透明度。

作为代理艺术家,您可以使用一个简单的矩形。但是,透明性需要计算为两个具有透明度0.2的对象一起显示为具有透明度0.36的单个对象(而不是0.4!)。

代码语言:javascript
运行
复制
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches

a = np.sort(np.random.rand(6,18), axis=0)
x = np.arange(len(a[0]))

def alpha(i, base=0.2):
    l = lambda x: x+base-x*base
    ar = [l(0)]
    for j in range(i):
        ar.append(l(ar[-1]))
    return ar[-1]

fig, ax = plt.subplots(figsize=(4,2))

handles = []
labels=[]
for i in range(len(a)/2):
    ax.fill_between(x, a[i, :], a[len(a)-1-i, :], color="blue", alpha=0.2)
    handle = matplotlib.patches.Rectangle((0,0),1,1,color="blue", alpha=alpha(i, base=0.2))
    handles.append(handle)
    label = "quant {:.1f} to {:.1f}".format(float(i)/len(a)*100, 100-float(i)/len(a)*100)
    labels.append(label)

plt.legend(handles=handles, labels=labels, framealpha=1)
plt.show()

我们必须决定这样做是否值得。没有透明度但结果完全相同的解决办法可以短得多:

代码语言:javascript
运行
复制
import matplotlib.pyplot as plt
import numpy as np

a = np.sort(np.random.rand(6,18), axis=0)
x = np.arange(len(a[0]))

fig, ax = plt.subplots(figsize=(4,2))

for i in range(len(a)/2):
    label = "quant {:.1f} to {:.1f}".format(float(i)/len(a)*100, 100-float(i)/len(a)*100)
    c = plt.cm.Blues(0.2+.6*(float(i)/len(a)*2)  )
    ax.fill_between(x, a[i, :], a[len(a)-1-i, :], color=c, label=label)

plt.legend( framealpha=1)
plt.show()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42347095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档