Python 在FACS中绘制交错直方图/线

Python 在FACS中绘制交错直方图/线,python,matplotlib,plot,Python,Matplotlib,Plot,我的问题基本上与matplotlib的问题相同。我确信它与轴或子图有关,但我不认为我完全理解这些范例(更全面的解释会更好) 当我循环进行一组比较时,我希望将每个新绘图的基y值设置为略低于前一个绘图的值,得到如下结果: 另一个(潜在的)问题是,我在循环中生成这些图,所以我不一定知道一开始会有多少个图。我想这是我被挂在子地块/轴上的事情之一,因为看起来你需要提前设置它们 任何想法都将不胜感激 编辑:我取得了一些进步,我想: import numpy as np import pandas as

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

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

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

任何想法都将不胜感激

编辑:我取得了一些进步,我想:

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)
给我:


这与我想要的很接近…

这是你想要的吗

我所做的是定义每条曲线基线之间的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()

因此,通过在每个循环中添加一个额外的Axis实例,我设法走得更远一些

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()


很明显,我可以花更多的时间使它更漂亮,但这确实起到了作用。

您也可以通过以下方式来考虑安装JoyPy:

pip安装joypy

莱昂纳多·塔卡里(Leonardo Taccari)创建的非常动态的工具,如果您正在查看的是“堆叠”分布图,如下所示:

示例1-使用JoyPy的Joy绘图:

示例2-Iris数据集上的Joy图:

莱昂纳多还清楚地描述了这个软件包以及如何使用它

另外,Seaborn也有一个功能,但我发现它不太容易使用


希望有帮助

是的,这正是我想要的。我想我知道你做了什么,但是你能稍微澄清一下你的虚拟数据的结构吗?我不理解您如何创建
arr
的语法。但不管怎样,它看起来像是在向绘图函数提供一个包含所有数据的列表,并且for循环中的每个
i,Y
都会生成一条新行?@kevbonham,是的,每次通过for循环都会绘制一条新行。为了生成虚拟数据,我初始化了一个1000个零的数组,然后将其中100个零换成高斯曲线。根据数据的结构,您可能希望做一些不同的事情。峰值在左边的曲线可能会在峰值在右边的曲线之前出现吗?我想我无法预测。我越是研究它,我就越不认为这种绘图方法是最好的方法。但是你回答了我的问题,所以我会记下来。我自己用了一个稍有不同的解决方案,做了一点进一步的探讨——你认为在我的问题的底部加上这个,或者把它作为另一个答案放进去更合适吗?你也可以把它作为另一个答案加进去。