我有一个包含20列的数据框。我希望创建一个散点图,每个散点图都有一条最合适的线。 x列将是常量,我想使用for循环来遍历数据框中的每个其他列。结果将是19个散点图。
我当前的设置看起来像这样:
columns = [1,2,3,4,5,6,7...20]
for column in columns:
x= df[another column from the dataframe]
y= df[column]
fit = polyfit(x,y,1)
fitx = poly1d(fit)
plt.plot(x,y,'b+',
x,fitx(x),'b-')
这将在单个轴上绘制19条最佳拟合线,而不是创建19个轴。关于如何解决这个问题的任何想法?
答案 0 :(得分:2)
您必须明确创建每个子图。在这个玩具代码中,我使用一个4x5网格,这导致最后一个空图。
使用plt.subplots(nrows, ncols, ...)
创建子图。我对4x5的选择是任意的。您可以通过更改行数和列数来轻松调整网格。
from itertools import chain
import numpy as np
import pandas as pd
import matplotlib.pylab as plt
np.random.seed(42)
# prepare sample data
columns = ["col" + str(i) for i in range(1, 21)]
data = {col: np.random.rand(10) for col in columns}
df = pd.DataFrame(data)
x_column = "col1"
cols = columns[:]
cols.remove(x_column)
plt, axes = plt.subplots(4, 5, sharex=True, sharey=True, figsize=(12,12))
flat_axes = chain(*axes)
for y_column, ax in zip(cols, flat_axes):
if y_column != x_column:
x = df[x_column]
y = df[y_column]
fit = np.polyfit(x, y, 1)
fitx = np.poly1d(fit)
ax.plot(x, y, 'b+', x, fitx(x),'b-')
这是结果: