绘制多个散点图 pandas
Plotting multiple scatter plots pandas
我认为关于绘制多张图有很多问题,但不是专门针对这种情况,如下所示。
pandas 文档说 'repeat plot method' 在单个轴上绘制多个列组。但是,这对于 3 个或更多列组如何工作?例如,如果我们定义第三列:
bx = df.plot(kind='scatter', x='a',y='f',color = 'Green',label ='f')
这个bx会传到哪里去?
此外,如果绘图是同一张图,x 轴不应该一直是 'a' 或 'c' 吗?但文档有 2 个不同的 x 轴:'a' and 'c'
您可以根据您喜欢的任何列绘制任何列。这是否有意义,您必须自己决定。例如。在同一轴上绘制表示时间的列与表示距离的列可能没有意义,但是在同一轴上绘制两个包含距离的列就可以了。
为了指定某个图应该在已经存在的坐标轴 (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()
Where would this bx be passed into?
您应该重复对 plot
的第二次调用,而不是第一次,因此不需要 bx
。
详细说明:plot
采用可选的 ax
参数。这是它绘制的轴。如果未提供参数,则该函数会创建一个新的绘图和坐标轴。此外,轴由函数返回,因此可以重复用于进一步的绘图操作。这个想法是 而不是 将 ax
参数传递给对 plot
的第一次调用,并在所有后续调用中使用返回的轴。
您可以验证每次调用绘制 returns 它所传递的相同轴:
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
Also, if the plot is the same graph, shouldn't the x-axis be consistently either 'a' or 'c'?
不一定。将不同的列放在同一轴上是否有意义取决于它们代表的数据。例如,如果 a
是收入,c
是支出,那么将两者放在同一个 'money' 轴上是有意义的。相反,如果 a
是豌豆的数量而 c
是电压,则它们可能不在同一轴上。
在 holoviz ecosystem, there is a library called hvplot
which provides very nice high-level plotting functionality (on top of 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')
您可以在 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)
)
然后,当然,dataframe 的列和颜色也可以从代码生成而不是硬编码。
如果您选择不同的绘图后端,例如 plotly 而不是 matplotlib,使用参数 backend=plotly
:
,这已成为 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 文档说 'repeat plot method' 在单个轴上绘制多个列组。但是,这对于 3 个或更多列组如何工作?例如,如果我们定义第三列:
bx = df.plot(kind='scatter', x='a',y='f',color = 'Green',label ='f')
这个bx会传到哪里去?
此外,如果绘图是同一张图,x 轴不应该一直是 'a' 或 'c' 吗?但文档有 2 个不同的 x 轴:'a' and 'c'
您可以根据您喜欢的任何列绘制任何列。这是否有意义,您必须自己决定。例如。在同一轴上绘制表示时间的列与表示距离的列可能没有意义,但是在同一轴上绘制两个包含距离的列就可以了。
为了指定某个图应该在已经存在的坐标轴 (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()
Where would this bx be passed into?
您应该重复对 plot
的第二次调用,而不是第一次,因此不需要 bx
。
详细说明:plot
采用可选的 ax
参数。这是它绘制的轴。如果未提供参数,则该函数会创建一个新的绘图和坐标轴。此外,轴由函数返回,因此可以重复用于进一步的绘图操作。这个想法是 而不是 将 ax
参数传递给对 plot
的第一次调用,并在所有后续调用中使用返回的轴。
您可以验证每次调用绘制 returns 它所传递的相同轴:
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
Also, if the plot is the same graph, shouldn't the x-axis be consistently either 'a' or 'c'?
不一定。将不同的列放在同一轴上是否有意义取决于它们代表的数据。例如,如果 a
是收入,c
是支出,那么将两者放在同一个 'money' 轴上是有意义的。相反,如果 a
是豌豆的数量而 c
是电压,则它们可能不在同一轴上。
在 holoviz ecosystem, there is a library called hvplot
which provides very nice high-level plotting functionality (on top of 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')
您可以在 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)
)
然后,当然,dataframe 的列和颜色也可以从代码生成而不是硬编码。
如果您选择不同的绘图后端,例如 plotly 而不是 matplotlib,使用参数 backend=plotly
:
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,
)
结果图: