使用matplotlib
从pandas
数据帧中制作一系列散点图的最佳方法是什么?
例如,如果我有一个包含一些感兴趣的列的数据框df
,我通常会将所有内容转换为数组:
import matplotlib.pylab as plt
# df is a DataFrame: fetch col1 and col2
# and drop na rows if any of the columns are NA
mydata = df[["col1", "col2"]].dropna(how="any")
# Now plot with matplotlib
vals = mydata.values
plt.scatter(vals[:, 0], vals[:, 1])
将所有内容转换为数组后进行绘图的问题在于,它会强制你跳出数据框架。
考虑以下两种情况,在这些情况下,完整的数据框架对于绘图至关重要:
例如,如果您现在想查看调用
scatter
时绘制的对应值的所有col3
的值,并根据该值对每个点(或大小)进行着色,该怎么办?您必须返回去,提取col1、col2
的非空值,并检查它们的相应值。有没有一种方法可以在保持数据框架的同时进行绘图呢?例如:
mydata = df.dropna(how="any", subset=["col1", "col2"])
# plot a scatter of col1 by col2, with sizes according to col3
scatter(mydata(["col1", "col2"]), s=mydata["col3"])
同样地,想象一下你想根据数据框某些列的值来筛选或对每个点着色。例如,如果您想要自动绘制满足 col1、col2
上某个截止值的点的标签(标签存储在数据框的另一列中),或者像 R 中的数据框一样对这些点进行不同的颜色着色。例如: mydata = df.dropna(how="any", subset=["col1", "col2"])
myscatter = scatter(mydata[["col1", "col2"]], s=1)
# Plot in red, with smaller size, all the points that
# have a col2 value greater than 0.5
myscatter.replot(mydata["col2"] > 0.5, color="red", s=0.5)
如何完成此操作?
编辑 回复 crewbum:
你说最好的方法是分别绘制每个条件(例如 subset_a
,subset_b
)。如果有很多条件,例如您想将散点图分为4种或更多类型的点,并以不同的形状/颜色绘制每种类型。您如何优雅地应用条件a、b、c等并确保然后将“其余部分”(不属于这些条件中任何一个的事物)作为最后一步绘制?
在您绘制 col1,col2
不同于基于 col3
的示例中,如果存在破坏 col1,col2,col3
之间关联的 NA 值怎么办?例如,如果您想根据它们的 col3
值绘制所有 col2
值,但某些行在 col1
或 col3
中具有 NA 值,则强制您首先使用 dropna
。因此,您需要执行以下操作:
mydata = df.dropna(how="any", subset=["col1", "col2", "col3")
那么你可以使用 mydata
进行绘图,就像你展示的一样 - 使用 col3
的值绘制 col1,col2
之间的散点。但是,mydata
将缺少某些具有 col1,col2
值但对于 col3
是 NA 的点,并且这些点仍然需要绘制... 那么你如何基本绘制“剩余”的数据,即不在过滤集合mydata
中的点?