python - 像 FACS 一样绘制交错的直方图/线

标签 python matplotlib plot

我的问题基本上与 this one 相同但是对于 matplotlib。我确定它与轴或子图有关,但我不认为我完全理解这些范例(更全面的解释会很好)。

当我循环进行一组比较时,我希望将每个新图的基本 y 值设置为略低于前一个,以获得如下结果:

enter image description here

另一个(潜在的)问题是我在循环中生成这些图,所以我不一定知道一开始会有多少图。我认为这是我对子图/轴挂断的事情之一,因为看起来你需要提前设置它们。

任何想法将不胜感激。

编辑:我认为我取得了一点进步:

import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt

x = np.random.random(100)
y = np.random.random(100)


fig = plt.figure()
ax = fig.add_axes([1,1,1,1])
ax2 = fig.add_axes([1.02,.9,1,1])

ax.plot(x, color='red')
ax.fill_between([i for i in range(len(x))], 0, x, color='red', alpha=0.5)
ax2.plot(y, color='green')
ax2.fill_between([i for i in range(len(y))], 0, y, color='green', alpha=0.5)

给我: enter image description here

这接近我想要的......

最佳答案

这是您想要的吗?

stacked plots

我所做的是定义每条曲线基线之间的 y 距离。对于第 i 条曲线,我计算了最小 Y 值,然后将该最小值设置为 i 乘以 y 距离,相应地调整整条曲线的高度。我使用递减的 z 顺序来确保曲线的填充部分不会被基线遮挡。

代码如下:

import numpy as np
import matplotlib.pyplot as plt

delta_Y = .5

zorder = 0
for i, Y in enumerate(data):
  baseline = min(Y)
  #change needed for minimum of Y to be delta_Y above previous curve
  y_change = delta_Y * i - baseline
  Y = Y + y_change
  plt.fill_between(np.linspace(0, 1000, 1000), Y, np.ones(1000) * delta_Y * i, zorder = zorder)
  zorder -= 1

生成虚拟数据的代码:

def gauss(X):
  return np.exp(-X**2 / 2.0)

#create data
X = np.linspace(-10, 10, 100)
data = []
for i in xrange(10):
  arr = np.zeros(1000)
  arr[i * 100: i * 100 + 100] = gauss(X)
  data.append(arr)
data.reverse()

关于python - 像 FACS 一样绘制交错的直方图/线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31835547/

相关文章:

python - 为什么 MaxAbsScaler() 不将列范围设置为 [-1,1]?

python - 如何在循环中使用groupby()函数?

python - 使用python从多个文件导入数据

python - 使用 matplotlib 绘制大量时间序列数据点

python - 如何在一个轴上绘制两个 barh?

Axis 在中心的 R 图

python - numpy.ndarray 枚举适当的维度子集?

python - 交互式 Matplotlib 窗口未更新

python - 使用 matplotlib 直方图时如何旋转轴标签?

python - 如何用 Python 绘制多边形?