首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每条直方图曲线下的渐变填充- Python

每条直方图曲线下的渐变填充- Python
EN

Stack Overflow用户
提问于 2020-05-21 11:09:49
回答 1查看 481关注 0票数 0

我正在尝试使用seaborn facet grid将多个直方图的渐变填充结合在一起,其中渐变由每条曲线下的值的扩散确定,而不仅仅是使用huerowcol序列。下面有一些链接,它们在python中执行了一些类似的功能:

How to fill histogram with gradient color填充了一个发散的梯度,但每个直方图都独立于其他直方图,因此直方图之间的比较有点无效。使用下图,每个直方图应该是相对于其他直方图的。此外,它没有使用海运facet grid,这是这里的核心问题。

How to generate series of histograms不绘制直方图。它只是填充了曲线下的区域。

我发现了一些显示我希望执行的内容的图像,但它们似乎都是在R中生成的,没有使用python。我的假设是,到目前为止,使用seaborn的功能还不存在,我将不得不使用R,但我认为这将适用于许多用户。

使用下面的代码,我们可以将使用hue的渐变调整更改为rowcol,但这不考虑曲线下的区域。

代码语言:javascript
复制
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

# Create the data
rs = np.random.RandomState(1979)
x = rs.randn(120)
g = np.tile(list("ABCD"), 30)
h = np.tile(list("XYZ"), 40)

# Generate df
df = pd.DataFrame(dict(x = x, g = g, h = h))

# Initialize the FacetGrid object
pal = sns.cubehelix_palette(4, rot = -0.25, light = 0.7)
g = sns.FacetGrid(df, col = 'h', hue = 'h', row = 'g', aspect = 3, height= 1, palette = pal)

# Draw the densities 
g = g.map(sns.kdeplot, 'x', shade = True, alpha = 0.8, lw = 1, bw = 0.8)
g = g.map(sns.kdeplot, 'x', color= 'w', lw = 1, bw = 0.8)
g = g.map(plt.axhline, y = 0, lw = 1)

# Adjust title and axis labels directly
g.axes[0,0].set_ylabel('L 1')
g.axes[1,0].set_ylabel('L 2')
g.axes[2,0].set_ylabel('L 3')
g.axes[3,0].set_ylabel('L 4')

g.axes[0,0].set_title('Top 1')
g.axes[0,1].set_title('Top 2')
g.axes[0,2].set_title('Top 3')

g.axes[1,0].set_title('')
g.axes[1,1].set_title('')
g.axes[1,2].set_title('')
g.axes[2,0].set_title('')
g.axes[2,1].set_title('')
g.axes[2,2].set_title('')
g.axes[3,0].set_title('')
g.axes[3,1].set_title('')
g.axes[3,2].set_title('')

g.set_axis_labels(x_var = 'Total Amount')
g.set(yticks = [])

输出:

有一个可以为rowcol调整的梯度,但我希望将这个梯度传递到每个直方图曲线下面的区域。如上图所示。因此,每条曲线下的面积在小于零时会变亮,而在高于零时会变暗。

甚至将曲线下的面积调整到中值可能就足够了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-21 21:02:58

您可以创建图像渐变,并使用直方图本身作为图像的剪切路径,以便唯一可见的部分是曲线下的部分。

因此,您可以尝试创建图像时可用的任何cmap和规范化。

下面是一个快速示例:

代码语言:javascript
复制
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

# Create the data
rs = np.random.RandomState(1979)
x = rs.randn(120)
g = np.tile(list("ABCD"), 30)
h = np.tile(list("XYZ"), 40)

# Generate df
df = pd.DataFrame(dict(x = x, g = g, h = h))

# Initialize the FacetGrid object
pal = sns.cubehelix_palette(4, rot = -0.25, light = 0.7)
g = sns.FacetGrid(df, col = 'h', hue = 'h', row = 'g', aspect = 3, height= 1, palette = pal)

# Draw the densities 
g = g.map(sns.kdeplot, 'x', shade = True, alpha = 0.8, lw = 1, bw = 0.8)
g = g.map(sns.kdeplot, 'x', color= 'w', lw = 1, bw = 0.8)
g = g.map(plt.axhline, y = 0, lw = 1)

for ax in g.axes.flat:
    ax.set_title("")

# Adjust title and axis labels directly
for i in range(4):
    g.axes[i,0].set_ylabel('L {:d}'.format(i))
for i in range(3):
    g.axes[0,i].set_title('Top {:d}'.format(i))



# generate a gradient
cmap = 'coolwarm'
x = np.linspace(0,1,100)
for ax in g.axes.flat:
    im = ax.imshow(np.vstack([x,x]), aspect='auto', extent=[*ax.get_xlim(), *ax.get_ylim()], cmap=cmap, zorder=10)
    path = ax.collections[0].get_paths()[0]
    patch = matplotlib.patches.PathPatch(path, transform=ax.transData)
    im.set_clip_path(patch)

g.set_axis_labels(x_var = 'Total Amount')
g.set(yticks = [])

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

https://stackoverflow.com/questions/61926533

复制
相关文章

相似问题

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