DataFrame.plot.scatter和DataFrame.plot.density()之间的不一致?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DataFrame.plot.scatter和DataFrame.plot.density()之间的不一致?相关的知识,希望对你有一定的参考价值。
以下示例说明了来自pandas DataFrame的散点图和密度图之间的奇怪差异,或者可能是我缺乏理解:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
n = 25
df = pd.DataFrame({'x': np.random.randn(n), 'y': np.random.randn(n), 'season': np.random.choice(['winter', 'summer'], n)})
plot = df.plot.scatter(x='x', y='y')
plot.get_figure().savefig("test_scatter_all.png")
for s in ['winter', 'summer']:
sdf = df[df['season'] == s]
plot = sdf.plot.scatter(x='x', y='y')
plot.get_figure().savefig("test_scatter_" + s + ".png")
plt.clf()
plot = df['y'].plot.density()
plot.get_figure().savefig("test_density_all.png")
for s in ['winter', 'summer']:
sdf = df[df['season'] == s]
plot = sdf['y'].plot.density()
plot.get_figure().savefig("test_density_" + s + ".png")
让我感到惊讶的是,密度图是附加的,因为冬季图表包括两个密度(“全部”和冬季),而夏季图表包括所有三个密度。另一方面,散点图仅包括它们自己的点,即冬季地块的冬季值等。
此外,如果没有plt.clf()
命令,密度图还将包括最后一个散点图(夏季)的点。
为什么两种情节类型之间存在差异?这是否意味着我应该在开始新剧情之前总是使用plt.clf()
?
并且,作为旁注,使用plot
对象实际上是否有意义?我看到我可以生成第一个情节
df.plot.scatter(x='x', y='y')
plt.savefig("test_scatter_all.png")
同样,捕获plot()
方法的输出有什么意义吗?它是否意味着plot()
方法始终只有一个活动的数字对象?
答案
不一致不是在密度和散射之间,而是在数据框的绘图方法和系列的绘图方法之间:
- 系列
Series.plot
被绘制到活动轴,如果有的话,则创建一个新的图形。 - 数据框
DataFrame.plot
被绘制成一个新的数字,与是否已存在的数据无关。
例:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({'x': np.random.randn(25), 'y': np.random.randn(25),
'season': np.random.choice(['red', 'gold'], 25)})
# This plots the dataframe, and creates two figures
for s in ['red', 'gold']:
sdf = df[df['season'] == s]
plot = sdf.plot(kind="line",color=s)
plt.show()
# This plots a series, and creates a single figure
for s in ['red', 'gold']:
sdf = df[df['season'] == s]
plot = sdf["y"].plot(kind="line",color=s)
plt.show()
在这里,sdf.plot
创造了两个数字,而sdf["y"].plot
绘制了相同的轴。
If the problem is to keep a previously plotted density in the plot, you may plot this density, add another one, save the figure and finally remove the second plot, such that you end up with the first density plot, ready to plot something else to it.
import numpy as np
import pandas as pd
df = pd.DataFrame({'x': np.random.randn(25), 'y': np.random.randn(25),
'season': np.random.choice(['red', 'gold'], 25)})
ax = df['y'].plot.density()
for s in ['red', 'gold']:
sdf = df[df['season'] == s]
sdf["y"].plot.density(color=s)
ax.get_figure().savefig("test_density_" + s + ".png")
ax.lines[-1].remove()
以上是关于DataFrame.plot.scatter和DataFrame.plot.density()之间的不一致?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 matplotlib 3.3.1 获取没有填充的标记