【问题标题】:How to plot several cumulative distribution functions from data in a CSV file in Python?如何在 Python 中从 CSV 文件中的数据中绘制多个累积分布函数?
【发布时间】:2016-11-07 16:37:51
【问题描述】:

我正在尝试创建一个 python 脚本,该脚本读取一个 CSV 文件,该文件包含按第一行中的示例名称排列的数据以及每个名称下方的数据,如下所示:

sample1,sample2,sample3
343.323,234.123,312.544

我试图从数据集中将每个样本的累积分布函数绘制到同一轴上。使用下面的代码:

import matplotlib.pyplot as plt
import numpy as np
import csv


def isfloat(value):
    '''make sure sample values are floats
    (problem with different number of values per sample)'''
    try:
      float(value)
      return True
    except ValueError:
      return False

def createCDFs (dataset):
    '''create a dictionary with sample name as key and data for each
    sample as one list per key'''
    dataset = dataset
    num_headers = len(list(dataset))
    dict_CDF = {}
    for a in dataset.keys():
        dict_CDF["{}".format(a)]= 1. * np.arange(len(dataset[a])) / (len(dataset[a]) - 1)
    return dict_CDF

def getdata ():
    '''retrieve data from a CSV file - file must have sample names in first row
    and data below'''

    with open('file.csv') as csvfile:
        reader = csv.DictReader(csvfile, delimiter = ',' )
        #create a dict that has sample names as key and associated ages as lists
        dataset = {}
        for row in reader:
            for column, value in row.iteritems():
                if isfloat(value):
                    dataset.setdefault(column, []).append(value)
                else:
                    break
        return dataset

x = getdata()
y = createCDFs(x)

#plot data
for i in x.keys():
    ax1 = plt.subplot(1,1,1)
    ax1.plot(x[i],y[i],label=str(i))


plt.legend(loc='upper left')
plt.show()

这给出了下面的输出,它只正确显示了其中一个示例(图 1A 中的示例 1)。

Figure 1A. Only one CDF is displaying correctly (Sample1). B. Expected output

每个样本的值数量不同,我认为这就是我的问题所在。

这一直困扰着我,因为我认为解决方案应该相当简单。任何帮助/建议都会有所帮助。我只是想知道如何正确显示数据。数据可以在here找到。预期输出如图 1B 所示。

【问题讨论】:

  • sample2 和 3 的预期 cdf 是多少?
  • 我添加了 Excel 中生成的预期输出图像
  • 我还是只能看到上一张图,应该不止一个链接吗?
  • 道歉。修好了。
  • 我猜你没有从 CSV 读取所有数据,检查 x.shape 看看它是你所期望的。

标签: python numpy matplotlib cumulative-sum


【解决方案1】:

这是一个更简单的方法。这当然取决于你是否想使用熊猫。我使用this 方法计算cum dist

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

data_req = pd.read_table("yourfilepath", sep=",")
#sort values per column
sorted_values = data_req.apply(lambda x: x.sort_values())

#plot with matplotlib
#note that you have to drop the Na's on columns to have appropriate
#dimensions per variable.

for col in sorted_values.columns: 
    y = np.linspace(0.,1., len(sorted_values[col].dropna()))
    plt.plot(sorted_values[col].dropna(), y)

最后,我得到了你要找的图:

【讨论】:

  • 太棒了!非常感谢。这很好用,除了数据排序似乎不起作用。我在 CSV 中添加了一个未排序的样本,而您的代码没有对添加的样本进行排序。但是一旦我对原始数据进行排序,它就起作用了。有什么想法吗?
  • 还有。说到 Python,我相当菜鸟,所以我实际上并不知道 panda 包 - 所以谢谢你!
  • 我找到了排序问题的解决方案。我用以下代码替换了您的排序代码:arr = data_req.valuesarr.sort(axis=0)data_req = pd.DataFrame(arr, index=data_req.index, columns=data_req.columns)
猜你喜欢
  • 2021-02-11
  • 1970-01-01
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
相关资源
最近更新 更多