使用Python的pandas从数据框中创建matplotlib散点图。

7 浏览
0 Comments

使用Python的pandas从数据框中创建matplotlib散点图。

如何使用Python中的matplotlibpandas 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])

在绘图之前将所有内容转换为数组的问题是,它强制你退出数据框。

考虑以下两种情况,完整的数据框对于绘图是必不可少的:

  1. 例如,如果您现在想要查看在调用scatter时绘制的相应值的col3的所有值,并按该值对每个点进行染色(或调整大小)怎么办?您必须返回去,提取col1,col2的非NA值并检查它们的相应值。

    有没有一种方法可以在保留数据框的同时进行绘图?例如:

    mydata = df.dropna(how="any", subset=["col1", "col2"])
    # 绘制col1和col2的散点图,根据col3的大小
    scatter(mydata(["col1", "col2"]), s=mydata["col3"])
    

  2. 类似地,想象一下,如果您想要根据其某些列的值为每个点过滤或着色。例如,如果您想要自动绘制满足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_asubset_b)。如果有很多条件,例如您想将散点图分成4种类型的点或更多类型,并使用不同的形状/颜色绘制每种类型,那么如何优雅地应用条件a,b,c等,并确保然后绘制“剩下”的(即不属于任何这些条件的)数据作为最后一步?

类似地,在您根据col3不同方式绘制col1,col2的示例中,如果有NA值破坏了col1,col2,col3之间的关联,该怎么办?例如,如果您想要根据它们的col3值绘制所有col2值,但某些行在col1col3中有一个NA值,这将强制您首先使用dropna。所以您将执行以下操作:

mydata = df.dropna(how="any", subset=["col1", "col2", "col3")

然后您可以使用mydata进行绘图,如您所示-使用col3的值在col1,col2之间绘制散点图。但是mydata将缺少一些具有col1,col2值但对于col3而言是NA的点,而这些点仍然必须绘制...那么您将如何绘制数据的“剩余”部分,即不在过滤集mydata中的点?

0