首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在matplotlib上生成一系列直方图?

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

Stack Overflow用户
提问于 2018-10-05 04:28:53
回答 1查看 2.7K关注 0票数 4

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

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

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

代码语言:javascript
复制
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()

这很好,但是是否可以用直方图代替连续曲线呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-05 06:55:28

编辑:

基于乐趣的方法,如10月份的评论中提到的:

代码语言:javascript
复制
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)

为了更好地控制颜色,您可以定义一个颜色梯度函数,该函数接受分数索引,并开始和停止颜色元组:

代码语言:javascript
复制
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)

用法:

代码语言:javascript
复制
joypy.joyplot(df, overlap=2, colormap=lambda x: color_gradient(x, start=(.78, .25, .09), stop=(1.0, .64, .44)), linecolor='w', linewidth=.5)

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

原始答案:

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

创建一些示例数据:

代码语言:javascript
复制
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

编剧系列:

代码语言:javascript
复制
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')

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

编辑:

正如我在下面评论的那样,我不太确定我是否理解你想要什么,或者你是否想要最好的完成你的任务。因此,在这里,除了您的编辑方法之外,还有一段代码展示了如何以一种更好的可比较性的方式呈现一组直方图:

代码语言:javascript
复制
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)

这导致了以下阴谋:

  1. 你编辑的情节:

  1. N个子图中的N个直方图:

  1. N条柱状图在一个图中并排排列:

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

https://stackoverflow.com/questions/52658364

复制
相关文章

相似问题

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