首页 > 解决方案 > Python绘图字典

问题描述

我对 python/pandas/matplotlib 的世界非常陌生,但我最近一直在使用它来创建盒须图。我很好奇如何使用特定的数据列为每张纸创建箱须图,即我有 17 张纸,每张纸上都有名为 HMB 和 DV 的列。我想在 HMB 的 Box and Whisker 上绘制 17 个数据集,在 DV 图上绘制另外 17 个数据集。以下是我到目前为止所拥有的。

我可以打开文件,并将所有工作表放入 list_dfs,但不知道从那里去哪里。我打算尝试手动对每组进行切片(正如我在来这里寻求帮助之前从下面开始的那样),但是当我将来有更多数据时,我不想手动进行。任何帮助将不胜感激!

import pandas as pd
import numpy as np
import xlrd
import matplotlib.pyplot as plt
%matplotlib inline
from pandas import ExcelWriter
from pandas import ExcelFile
from pandas import DataFrame

excel_file =  'Project File Merger.xlsm'

list_dfs = []

xls = xlrd.open_workbook(excel_file,on_demand=True)
for sheet_name in xls.sheet_names():
    df = pd.read_excel(excel_file,sheet_name)
    list_dfs.append(df) 

d_psppm = {}
for i, sheet_name in enumerate(xls.sheet_names()):
    df = pd.read_excel(excel_file,sheet_name)
    d_psppm["PSPPM" + str(i)] = df.loc[:,['PSPPM']]

values_list = list(d_psppm.values())
print(values_list[:])

示例输出如下所示,包含 17 个列表条目,但每个条目的行数不同。

                              PSPPM
0                             0.246769
1                             0.599589
2                             0.082420
3                             0.250000
4                             0.205140
5                             0.850000,
                              PSPPM
0                             0.500887
1                             0.475255
2                             0.472711
3                             0.412953
4                             0.415883
5                             0.703716,...

接下来我要做的是创建一个盒子和胡须图,1 个带有 17 个盒子和胡须的图。我不知道如何让字典以值和索引作为名称进行绘图。我试图挖掘,并弄清楚如何将字典转换为列表,然后绘制列表中的每个元素,但没有运气。

谢谢您的帮助!

标签: pythonpandasmatplotlib

解决方案


我同意@Alex 的观点,将你的列形成一个新的 DataFrame,然后从中进行绘图将是一个好方法,但是,如果你要使用 dict,那么它应该看起来像这样。根据您使用的 Python 版本,字典可能是无序的,因此如果绘图上的顺序对您很重要,那么您可能希望按您想要的顺序创建字典键列表并对其进行迭代

import matplotlib.pyplot as plt
import numpy as np

#colours = []#list of colours here, if you want
#markers = []#list of markers here, if you want
fig, ax = plt.subplots()
for idx, k in enumerate(d_psppm, 1):
    data = d_psppm[k]
    jitter = np.random.normal(0, 0.1, data.shape[0]) + idx
    ax.scatter(jitter, 
               data,
               s=25,#size of the marker
               c="r",#colour, could be from colours
               alpha=0.35,#opacity, 1 being solid
               marker="^",#or ref. to markers, e.g. markers[idx]
               edgecolors="none"#removes black border
              )

根据 Alex 的建议,您可以使用这些数据创建一个 seaborn 箱线图并覆盖一个 swarmplot 以显示数据(取决于每行有多少行,这是否可行)。


推荐阅读