我经常需要在一个简洁的图中指出一些数据的分布情况,如下图所示。我通过绘制几个fill_between
区域来实现这一点,这些区域受到分布的分位数的限制。
ax.fill_between(x, quantile1, quantile2, alpha=0.2)
在for循环中,我通过计算分位数1和2(如图例所示)生成这样的图: 0%到100%分位数,然后10%到90%等等,每个fill_between
在前一个“层”的顶部绘制。
这是带有三层透明颜色以及中线(0.5)的输出:
然而,传说中的颜色并不是我想要的那样,因为它们(自然)使用每一层的颜色,没有考虑到几层的综合效果。
ax.legend([0.5]+[['0.0%', '100.0%'], ['10.0%', '90.0%'], ['30.0%', '70.0%']])
在图例命令中覆盖面部颜色值的最佳方法是什么?
我想避免这样做,首先用0%至10%的透明度"0.2",然后再用10%至30%的透明度"0.4“等等,因为这将需要两倍的时间计算,使代码更加复杂。
发布于 2017-02-20 15:59:22
您可以使用代理艺术家在图例中放置与从情节中得到的结果完全相同的透明度。
作为代理艺术家,您可以使用一个简单的矩形。但是,透明性需要计算为两个具有透明度0.2
的对象一起显示为具有透明度0.36
的单个对象(而不是0.4
!)。
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()
我们必须决定这样做是否值得。没有透明度但结果完全相同的解决办法可以短得多:
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()
https://stackoverflow.com/questions/42347095
复制相似问题