【发布时间】:2012-12-27 07:58:27
【问题描述】:
在 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时绘制的相应值,并根据该值对每个点(或大小)进行着色?您必须返回,取出col1,col2的非 na 值并检查它们对应的值。有没有办法在保留数据框的同时进行绘图?例如:
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)
如何做到这一点?
编辑回复crewbum:
您说最好的方法是分别绘制每个条件(如subset_a、subset_b)。如果你有很多条件怎么办,例如您想将散点分成 4 种类型甚至更多,以不同的形状/颜色绘制每个点。您如何优雅地应用条件 a、b、c 等,并确保在最后一步绘制“其余”(不在任何这些条件下的事物)?
类似地,在您的示例中,您根据 col3 以不同方式绘制 col1,col2,如果有 NA 值破坏了 col1,col2,col3 之间的关联怎么办?例如,如果您想根据col3 值绘制所有col2 值,但某些行在col1 或col3 中具有NA 值,则迫使您首先使用dropna。所以你会这样做:
mydata = df.dropna(how="any", subset=["col1", "col2", "col3")
然后你可以像你展示的那样使用mydata 绘制——使用col3 的值绘制col1,col2 之间的散点图。但是mydata 将丢失一些具有col1,col2 值但对于col3 不适用的点,并且这些点仍然需要绘制......那么你将如何基本上绘制数据的“其余部分”,即过滤集mydata中不的点?
【问题讨论】:
-
在此期间情况有所变化,请参阅官方文档中的Plotting - Plotting - Scatter plot。
标签: python matplotlib plot dataframe pandas