使用Python 中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])
在绘图之前将所有内容转换为数组的问题在于它会迫使您脱离数据框。
考虑这两个用例,其中拥有完整的数据框对于绘图至关重要:
例如,如果您现在想查看在
col3
对 的调用中绘制的对应值的所有值scatter
,并按该值对每个点(或大小)进行着色,该怎么办?您必须返回,取出非 na 值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
的标签(标签存储在 df 的另一列中),或者对这些点进行不同的着色,就像人们对 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)
如何才能做到这一点?
编辑回复 crubbum:
您说最好的方法是分别绘制每个条件(如subset_a
, subset_b
)。如果您有很多条件,例如,您想将散点分成 4 种类型甚至更多,并以不同的形状/颜色绘制每个点,该怎么办。您如何优雅地应用条件 a、b、c 等,并确保在最后一步绘制“其余”(不在任何这些条件下的事物)?
同样,在您的示例中,您col1,col2
根据不同的方式进行绘图col3
,如果有 NA 值破坏了 之间的关联col1,col2,col3
怎么办?例如,如果您想col2
根据它们的值绘制所有值col3
,但某些行在col1
or中具有 NA 值col3
,则强制您首先使用dropna
。所以你会这样做:
mydata = df.dropna(how="any", subset=["col1", "col2", "col3")
然后你可以像你展示的那样使用 - 绘制使用 的值mydata
之间的散点图。但是会丢失一些具有值但 NA 的点,并且仍然必须绘制这些点......那么你将如何基本上绘制“其余”数据,即不在过滤集中的点?col1,col2
col3
mydata
col1,col2
col3
mydata