绘制多个散点图 pandas

40

我认为有很多关于绘制多个图表的问题,但没有专门针对下面所示情况的解答。

pandas文档中提到通过“重复绘图方法”在单个坐标轴上绘制多个列分组。然而,如果我们有三个或更多列分组,该如何操作?例如,如果我们定义了第三列:

bx = df.plot(kind='scatter', x='a',y='f',color = 'Green',label ='f')

这个bx会传递到哪里呢?

另外,如果图表是同一张图,那么x轴应该始终是“a”或“c”,但文档中有两个不同的x轴:“a”“c”

输入图像描述


请问您能否在问题中添加示例数据/初始化数据框? - Shivam Gaur
5个回答

36

这个bx需要传入哪里?

应该重复第二次调用plot而不是第一次,所以不需要使用bx

具体来说,plot接受一个可选的ax参数,它是绘制的坐标轴。如果未提供此参数,则函数将创建新的绘图和坐标轴。此外,函数返回该坐标轴,因此它可以用于进一步的绘图操作。关键点是不要ax参数传递给第一次调用plot,并在所有后续调用中使用返回的坐标轴。

您可以验证每次调用plot返回的是相同的坐标轴:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(100, 6), columns=['a', 'b', 'c', 'd', 'e', 'f'])


ax1 = df.plot(kind='scatter', x='a', y='b', color='r')    
ax2 = df.plot(kind='scatter', x='c', y='d', color='g', ax=ax1)    
ax3 = df.plot(kind='scatter', x='e', y='f', color='b', ax=ax1)

print(ax1 == ax2 == ax3)  # True

输入图像描述

另外,如果图表是同一张图,那么 x 轴应该始终是“a”或“c”吗?

不一定。将不同的列放在同一轴上是否合理取决于它们所代表的数据。例如,如果 a 表示收入而 c 表示支出,则将它们都放在同一个“货币”轴上是有意义的。相反,如果 a 表示豌豆数量而 c 表示电压,则它们可能不应该放在同一轴上。


10
我认为该库的潜在设计问题表现在,使用 df.plot(kind='line') 只需要一次调用即可绘制三条线,而 df.plot(kind='scatter') 却需要三次调用才能完成。这太愚蠢了。 - user2739472
1
这非常完美,适合任何需要它的人:使用label=''参数来适当地标记您的标记。 - Talha Imam
有人知道如何使用 plotly.express 实现这个吗? - DDStackoverflow

18

您可以绘制任何想要的列与任何其他列之间的关系。这是否有意义,您需要自己决定。例如,在同一个坐标轴上绘制表示时间的一列和表示距离的一列可能没有意义,但在同一个坐标轴上绘制包含距离信息的两列是可以的。

为了指定某个图应该在已经存在的轴(ax)上,您需要像文档中所示指定 ax 关键字。当然,您可以在同一个轴上创建多个图。

ax = df.plot(kind="scatter", x="x",y="a", color="b", label="a vs. x")
df.plot(x="x",y="b", color="r", label="b vs. x", ax=ax)
df.plot( x="x",y="c", color="g", label="c vs. x", ax=ax)

一个完整的例子:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,6.3, 50)
a = (np.sin(x)+1)*3
b = (np.cos(x)+1)*3
c = np.ones_like(x)*3
d = np.exp(x)/100.
df = pd.DataFrame({"x":x, "a":a, "b":b, "c":c, "d":d})

ax = df.plot(kind="scatter", x="x",y="a", color="b", label="a vs. x")
df.plot(x="x",y="b", color="r", label="b vs. x", ax=ax)
df.plot( x="x",y="c", color="g", label="c vs. x", ax=ax)
df.plot( x="d",y="x", color="orange", label="b vs. d", ax=ax)
df.plot( x="a",y="x", color="purple", label="x vs. a", ax=ax)

ax.set_xlabel("horizontal label")
ax.set_ylabel("vertical label")
plt.show()

输入图像描述


7

holoviz 生态系统中,有一个叫做 hvplot 的库,提供了非常好用的高级绘图功能(基于 holoviews),可以直接与 Pandas 一起使用:

import numpy as np
import hvplot.pandas
import pandas as pd

df = pd.DataFrame(np.random.randn(100, 6), columns=['a', 'b', 'c', 'd', 'e', 'f'])

df.hvplot(x='a', y=['b', 'c', 'd', 'e'], kind='scatter')

enter image description here


6

如果您选择不同的绘图后端,例如使用参数 backend=plotly 来使用 plotly 而不是 matplotlib,那么这将成为 pandas 中的一个简单一行代码:

import numpy as np
import pandas as pd
import hvplot.pandas

df = pd.DataFrame(np.random.randn(100, 6), columns=['a', 'b', 'c', 'd', 'e', 'f'])

# notice argument backend='plotly' to change the plotting backend of pandas
df.plot(
    kind='scatter',
    x='a', 
    y=['b', 'c', 'd', 'e'], 
    backend='plotly', 
    width=500,   
)

绘制出的图形如下:

不同的绘图后端使多个散点图易于绘制


1
在使用 backend='plotly' 作为参数之前,必须执行 pip install plotly hvplot 来安装 plotlyhvplot 包。 - Farid Alijani

1
你可以在for循环内自动绘制多个列。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.DataFrame(np.random.randn(100, 5), columns=['a', 'b', 'c', 'd', 'e',])

f,ax = plt.subplots(1)

for x,y,c in zip(['a','c','e'],['b','d','d'],['r','g','b']):
    df.plot(kind='scatter', 
            x=x, 
            y=y, 
            color=c, 
            ax=ax, 
            label='{} vs {}'.format(x,y)
            )

当然,数据框的列和颜色也可以通过代码生成而不是硬编码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接