【发布时间】:2021-02-26 23:13:37
【问题描述】:
我有以下 pandas 数据框,并希望在 a1 row 中水平创建 n 绘图,其中 n = unique labels(l1,l2,.)(例如,在以下示例中将有两个绘图,因为l1 and l2)。然后对于这两个图,每个图都将a4 绘制为 x 轴,a3 绘制为 y 轴。例如,ax[0] 将包含 a1 的图表,其中包含三条线,将点 [(1,15)(2,20)],[(1,17)(2,19)],[(1,23)(2,15)] 连接起来以获取以下数据。
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
d = {'a1': ['l1','l1','l1','l1','l1','l1','l2','l2','l2','l2','l2','l2'],
'a2': ['a', 'a', 'b','b','c','c','d','d','e','e','f','f'],
'a3': [15,20,17,19,23,15,22,21,23,23,24,27],
'a4': [1,2,1,2,1,2,1,2,1,2,1,2]}
df=pd.DataFrame(d)
df
a1 a2 a3 a4
1 a 15 1
1 a 20 2
1 b 17 1
1 b 19 2
1 c 23 1
1 c 15 2
2 d 22 1
2 d 21 2
2 e 23 1
2 e 23 2
2 f 24 1
2 f 27 2
我目前有以下:
def graph(dataframe):
x = dataframe["a4"]
y = dataframe["a3"]
ax[0].plot(x,y) #how do I plot and set the title for each group in their respective subplot without the use of for-loop?
fig, ax = plt.subplots(1,len(pd.unique(df["a1"])),sharey='row',figsize=(15,2))
df.groupby(["a1"]).apply(graph)
但是,我上面的尝试只在第一个子图上绘制所有 a3 和 a4(因为我写了ax[0].plot())。我总是可以使用 for 循环来完成所需的任务,但是对于 a1 中的大量唯一组,它的计算成本会很高。有没有办法让它成为ax[0].plot(x,y) 线上的单行代码,并且它可以在没有 for 循环的情况下完成所需的任务?任何意见表示赞赏。
【问题讨论】:
-
df.groupby(["a1"]).plot(x='a4', y='a3', subplots=True) -
@PaulH 我之前尝试过这种方法,但它显示的图形是垂直堆叠的(我希望它们水平堆叠,这个link 建议我使用
subplots而不是pandas.plot() -
@JayEstrera 你可以添加
layout=(1,2)让他们水平绘图 -
@a11 我相信在这种情况下,
layout=(1,2)只会拉伸或压缩图形,而不是水平对齐它们 -
好的,当我将每组 a1 的信息及其各自的索引存储到字典中时,
ax[dict.get(pd.unique(dataframe["a1"])[0])].plot(x,y)让我得到想要的结果
标签: python pandas dataframe matplotlib plot