使用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)
如何才能做到这一点?
编辑对乘员组的回复:
你说,最好的办法是画出每个条件(如subset_a
,subset_b
)分开。如果您有许多条件,例如要将散布分为4种或更多类型的点,并以不同的形状/颜色进行绘制,该怎么办?您如何优雅地应用条件a,b,c等,并确保随后绘制“其余”(这些条件中未包含的任何内容)作为最后一步?
类似地,在示例中,您col1,col2
根据进行col3
了不同的绘制,如果存在破坏两者之间关联的NA值col1,col2,col3
怎么办?例如,如果你想绘制所有col2
基于自己的价值观col3
价值,但某些行有任何的NA值col1
或col3
会迫使用户使用dropna
第一。所以你会做:
mydata = df.dropna(how="any", subset=["col1", "col2", "col3")
那么您可以如图所示使用mydata
-绘制col1,col2
使用的值之间的散点图col3
。但是mydata
会丢失一些具有的值col1,col2
但为的值为NA的点col3
,而这些点仍必须绘制...所以您基本上将如何绘制数据的“其余”,即不在过滤集中的点mydata
?