python - 如何迭代地绘制自定义数据框组
问题描述
我有多个数据框,我从 Excel 表中读取如下 -
A = pd.read_excel("sample.xlsx", usecols="A:B", sheet_name="A")
B = pd.read_excel("sample.xlsx", usecols="A:B", sheet_name="B")
...
...
每个数据框都有自己独特的 x 和 y 值,我可以使用以下代码制作组合图 -
ax.plot(A.iloc[:, 0], A.iloc[:, 1], color=colors(0), label='A')
ax.plot(B.iloc[:, 0], B.iloc[:, 1], color=colors(1), label='B')
...
...
我现在想在初始图中保留这个原始图,但还使用相同的数据另外制作多个图,以便我能够将其中一些图分组并为它们分配一个公共标签。我能想到的一个非常基本和残酷的代码如下 -
ax.plot(A.iloc[:, 0], A.iloc[:, 1], color=colors(0), label='A, B')
ax.plot(B.iloc[:, 0], B.iloc[:, 1], color=colors(0), label='A, B')
...
...
然而,这有一个缺点。如果这样做,我将有两个带有标签 [A, B] 的图例条目。此外,我从多个来源中提取了近 50 个这样的数据帧,不断更改这些图的所有颜色和标签将是一个繁琐的过程。
有没有办法可以根据需要对这些数据框进行分组并将它们标记为分组实体?我在想像下面这样的东西 -
ax.plot(A.iloc[:, 0], A.iloc[:, 1], color=colors(0), label='A')
ax.plot(B.iloc[:, 0], B.iloc[:, 1], color=colors(1), label='B')
...
...
set1 = [A, B, C]
set2 = [G, E, F]
ax.legend((set1), ('Legend for Set1'), color=colors(0))
ax.legend((set2), ('Legend for Set2'), color=colors(2))
这些分组也将发生变化,例如,在随后的图中,我希望将 (A, C, E) 组合在一起。有没有一种简单的方法可以在 Python 和 Matplotlib 中实现这一点?我是这个社区的新手,所以请让我知道下次我是否应该以不同的方式提出我的问题。
Ps - 如果我必须手动将我的组放在单独的标签中,我也很好
ax.legend((A, B, C), ('Legend for Set1'), color=colors(0))
解决方案
- 使用参数
sheet_name=None
inpandas.read_excel
创建 adict
ofdataframes
,其中每个工作表名称为 akey
,dataframe
工作表的 为value
。df_dict = pd.read_excel("sample.xlsx", usecols="A:B", sheet_name=None)
- 这将使迭代地创建每个
dataframe
的图或自定义组的dataframes
.
将所有内容绘制dataframes
为一个图形
- 要绘制每个
dataframe
,请使用 遍历key
value
对df_dict.items()
。 color=colors[i],
可以从 中删除ax.plot(...)
,因为绘图 API 将指定唯一颜色,前提是调色板中的绘图不超过唯一颜色。- 这演示了如何将所有这些绘制
dataframes
成一个图形。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns # just using it for the color palette
import numpy as np # for test data
# synthetic dict of dataframes used for plot example
df_dict = dict()
for i in range(1, 4):
rads = np.arange(0, 2*np.pi, 0.01)
data = np.sin(i*rads)
df_dict[f'freq: {i}x'] = pd.DataFrame({'x': rads, 'y': data})
# In your case, create a dict of dataframes by using the parameter sheet_name=None
df_dict = pd.read_excel("sample.xlsx", usecols="A:B", sheet_name=None)
# create colors from a palette; creates a list of colors based on the number of keys in df_dict
colors = sns.color_palette('husl', n_colors=len(df_dict.keys()))
# create a plot figure
fig, ax = plt.subplots(figsize=(8, 6))
# iterate through the dict and enumerate with i, i is used to index the colors
for i, (k, v) in enumerate(df_dict.items()):
# plot each dataframe, v, and use the key, k, to create a legend label
ax.plot(v.iloc[:, 0], v.iloc[:, 1], color=colors[i], label=f'{k}')
# place the legend outside the plot figure
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
绘制自定义组
df_dict
从上面使用dataframes
必须定义要一起绘制 的所有组。- 在这种情况下,a
list
oftuples
用于定义要一起绘制的组。
- 在这种情况下,a
# define the groups
groups = [('freq: 1x', 'freq: 2x'), ('freq: 1x', 'freq: 3x')]
# iterate through each group
for i, g in enumerate(groups, 1):
# create a plot figure for the group
fig, ax = plt.subplots(figsize=(8, 6))
# plot each dataframe in the group
for key in g:
# get the value for the key
v = df_dict[key]
# plot each dataframe, v, and use the key to create a legend label
ax.plot(v.iloc[:, 0], v.iloc[:, 1], label=f'{key}')
# place the legend outside the plot figure
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
# set the title
plt.title(f'Plot of group {i}')
推荐阅读
- scala - 如何在 Spark 数据集中计算组的行数并添加计数为零的组?
- python - dwt2 matlab函数在python pywt.dwt2函数中的结果不一样
- python - 目录未复制 - Docker
- javascript - 使用 setTimeout 链接承诺
- typescript - 无法动态设置接口对象的属性值
- android - 如何检测 Android 蓝牙 connectGatt() 自动连接完成
- python - 如果 URL 中存在参数,则使用 Listview 的 Django 自定义查询集
- r - 在for循环中将列表元素分配给变量名
- python - 使用拥抱脸和张量流对熊猫数据框中的文本进行分类
- javascript - onclick 表示函数未定义