绘制交错的直方图/线,如FACS中所示

时间:2015-08-05 14:34:57

标签: 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

哪个接近我想要的......

3 个答案:

答案 0 :(得分:4)

这是你想要的那种吗?

stacked plots

我所做的是定义每条曲线的基线之间的y距离。对于第i个曲线,我计算了最小Y值,然后将该最小值设置为y距离的i倍,相应地调整整个曲线的高度。我使用了递减的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()

答案 1 :(得分:2)

您还可以通过以下方式安装JoyPy:

pip install joypy

Leonardo Taccari创造的非常动态的工具,如果您正在研究的是"堆积"分布情节如下:

示例1 - 使用JoyPy的Joy Plot:
Joy Plot using JoyPy

示例2 - Iris数据集上的Joy Plot:
Joy Plot on Iris dataset

Leonardo也对该软件包以及如何使用它here进行了简洁的描述。

或者Seaborn有一个package,但我发现它不太容易使用。

希望有所帮助!

答案 2 :(得分:0)

所以我通过在每个循环中添加一个额外的Axes实例来设法得到更多。

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

#instantiate data sets
x = np.random.random(100)
y = np.random.random(100)
z = np.random.random(100)

plots = [x, y, z]
fig = plt.figure()

#Sets the default vertical position
pos = 1

def making_plot(ax, p):
    ax.plot(p)

    # Prevents the background from covering over the earlier plots
    ax.set_axis_bgcolor('none')

for p in plots:
    ax = fig.add_axes([1,pos,1,1])
    pos -= 0.3
    making_plot(ax, p)
plt.show()

enter image description here

显然,我可以花更多的时间让这个更漂亮,但这确实有效。