gpt4 book ai didi

python - 如何在matplotlib上生成一系列直方图?

转载 作者:行者123 更新时间:2023-12-03 23:21:43 24 4
gpt4 key购买 nike

我想生成如下所示的一系列直方图:

enter image description here

上面的可视化是在 tensorflow 中完成的,但我想在 matplotlib 上重现相同的可视化。

编辑:
使用@SpghttCd 建议的 plt.fill_between,我有以下代码:

colors=cm.OrRd_r(np.linspace(.2, .6, 10))
plt.figure()
x = np.arange(100)
for i in range(10):
y = np.random.rand(100)
plt.fill_between(x, y + 10-i, 10-i,
facecolor=colors[i]
edgecolor='w')
plt.show()

这很好用,但是可以使用直方图而不是连续曲线吗?

最佳答案

编辑:
基于 Joypy 的方法,如 10 月的评论中提到的:

import pandas as pd
import joypy
import numpy as np

df = pd.DataFrame()
for i in range(0, 400, 20):
df[i] = np.random.normal(i/410*5, size=30)
joypy.joyplot(df, overlap=2, colormap=cm.OrRd_r, linecolor='w', linewidth=.5)

enter image description here

为了更好地控制颜色,您可以定义一个颜色渐变函数,该函数接受小数索引以及开始和停止颜色元组:
def color_gradient(x=0.0, start=(0, 0, 0), stop=(1, 1, 1)):
r = np.interp(x, [0, 1], [start[0], stop[0]])
g = np.interp(x, [0, 1], [start[1], stop[1]])
b = np.interp(x, [0, 1], [start[2], stop[2]])
return (r, g, b)

用法:
joypy.joyplot(df, overlap=2, colormap=lambda x: color_gradient(x, start=(.78, .25, .09), stop=(1.0, .64, .44)), linecolor='w', linewidth=.5)

具有不同开始和停止元组的示例:

enter image description here

原始答案:

您可以迭代您想要使用 plt.fill_between 绘制的数据数组,将颜色设置为某种渐变并将线条颜色设置为白色:

创建一些示例数据:
import numpy as np
t = np.linspace(-1.6, 1.6, 11)
y = np.cos(t)**2
y2 = lambda : y + np.random.random(len(y))/5-.1

绘制系列:
import matplotlib.pyplot as plt

import matplotlib.cm as cm
colors = cm.OrRd_r(np.linspace(.2, .6, 10))

plt.figure()
for i in range(10):
plt.fill_between(t+i, y2()+10-i/10, 10-i/10, facecolor = colors[i], edgecolor='w')

enter image description here

如果您希望它针对您的示例进行更多优化,您或许应该考虑提供一些示例数据。

编辑:
正如我在下面评论的那样,我不太确定我是否理解您想要什么 - 或者您是否想要最适合您的任务。因此,这里有一个代码,除了您在编辑中的方法之外,还绘制了两个如何以更好的可比较方式呈现一堆直方图的示例:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cm as cm

N = 10
np.random.seed(42)

colors=cm.OrRd_r(np.linspace(.2, .6, N))

fig1 = plt.figure()
x = np.arange(100)
for i in range(10):
y = np.random.rand(100)
plt.fill_between(x, y + 10-i, 10-i,
facecolor=colors[i],
edgecolor='w')

data = np.random.binomial(20, .3, (N, 100))

fig2, axs = plt.subplots(N, figsize=(10, 6))
for i, d in enumerate(data):
axs[i].hist(d, range(20), color=colors[i], label=str(i))
fig2.legend(loc='upper center', ncol=5)


fig3, ax = plt.subplots(figsize=(10, 6))
ax.hist(data.T, range(20), color=colors, label=[str(i) for i in range(N)])
fig3.legend(loc='upper center', ncol=5)

这导致以下情节:
  • 你编辑的情节:
    enter image description here
  • N 个子图中的 N 个直方图:
    enter image description here
  • N 个直方图并排在一个图中:
    enter image description here
  • 关于python - 如何在matplotlib上生成一系列直方图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52658364/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com