使用Python的pandas从数据框中创建matplotlib散点图。
使用Python的pandas从数据框中创建matplotlib散点图。
如何使用Python中的matplotlib
从pandas
DataFrame制作一系列散点图的最佳方法?
例如,如果我有一个DataFrame df
,其中有一些感兴趣的列,我通常会将所有内容转换为数组:
import matplotlib.pylab as plt # df是一个DataFrame:获取col1和col2 # 如果有任何一个列中包含NA,则删除NA行 mydata = df[["col1", "col2"]].dropna(how="any") # 现在用matplotlib绘图 vals = mydata.values plt.scatter(vals[:, 0], vals[:, 1])
在绘图之前将所有内容转换为数组的问题是,它强制你退出数据框。
考虑以下两种情况,完整的数据框对于绘图是必不可少的:
- 例如,如果您现在想要查看在调用
scatter
时绘制的相应值的col3
的所有值,并按该值对每个点进行染色(或调整大小)怎么办?您必须返回去,提取col1,col2
的非NA值并检查它们的相应值。有没有一种方法可以在保留数据框的同时进行绘图?例如:
mydata = df.dropna(how="any", subset=["col1", "col2"]) # 绘制col1和col2的散点图,根据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) # 将所有col2值大于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
而言是NA的点,而这些点仍然必须绘制...那么您将如何绘制数据的“剩余”部分,即不在过滤集mydata
中的点?