绘制多个散点图 pandas

Posted

技术标签:

【中文标题】绘制多个散点图 pandas【英文标题】:Plotting multiple scatter plots pandas 【发布时间】:2017-08-21 01:37:05 【问题描述】:

我认为绘制多个图表有很多问题,但不是专门针对这种情况,如下所示。

pandas 文档说要使用“重复绘图方法”在单个轴上绘制多个列组。但是,这对 3 个或更多列组如何工作?例如,如果我们定义第三列:

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

这个 bx 会被传递到哪里?

另外,如果绘图是同一张图,x 轴不应该始终是“a”或“c”吗?但文档有 2 个不同的 x 轴:'a' 'c'

【问题讨论】:

能否在您的问题中添加示例数据/初始化数据框? 【参考方案1】:

您可以根据您喜欢的任何列绘制任何列。这是否有意义,您必须自己决定。例如。在同一轴上绘制表示时间的列与表示距离的列可能没有意义,但在同一轴上绘制两列都包含距离是可以的。

为了指定 certin 图应该在已经存在的轴 (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()

【讨论】:

【参考方案2】:

这个 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 是电压,它们可能不在同一轴上。

【讨论】:

太傻了,df.plot(kind='line') 只需要一次调用来绘制所有三行,而df.plot(kind='scatter') 需要三个调用。指向图书馆恕我直言的潜在不良设计。 这对任何需要它的人来说都是完美的:使用 label='' 参数适当地标记您的标记。 有谁知道如何使用plotly.express实现这一目标【参考方案3】:

在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')

【讨论】:

【参考方案4】:

您可以在 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)
            )

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

【讨论】:

【参考方案5】:

如果您使用参数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,   
)

结果图:

【讨论】:

以上是关于绘制多个散点图 pandas的主要内容,如果未能解决你的问题,请参考以下文章

Pandas / Pyplot中的散点图:如何按类别绘制[重复]

pandas散点图-plot.scatter

R绘图基础指南 3. 散点图(合集)

pandas绘制散点图矩阵 scatter_matrix函数报错问题

还在用Excel画散点图?不试试极坐标散点图?

绘制多个散点图 - 渲染问题