Plot axvline using a dataframe column error: ValueError: The truth value of a DataFrame is ambiguous.
Plot axvline using a dataframe column error: ValueError: The truth value of a DataFrame is ambiguous.
我正在尝试根据数据框的一列在散点图中添加一条水平线 - 我收到以下错误:ValueError:DataFrame 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
x_line = datLong.groupby('ctr1').agg({'maxx': ['mean']})
for country in datLong.ctr1.unique():
temp_df = plt.figure(country)
temp_df = datLong[datLong.ctr1 == country]
ax1 = temp_df.plot(kind='scatter', x='x', y='Price', color='#d95f0e', label = 'xx', linewidth =3, alpha = 0.7, figsize=(7,4))
plt.title(country)
plt.axvline(x=x_line) ### this is the line that is causing this error
plt.show()
print (ax1)
问题似乎与数据框有关。但我能弄清楚它是什么?谁能帮帮我
x_line
包含所有国家/地区的值。使用 x_line.loc[country]
您将获得该国家/地区的值。因为它 returns 一个数组(只有一个元素),并且 axvline
只接受单个值,所以你可以 select 它的第一个元素 (x_line.loc[country][0]
).
请注意,plt.figure
创建了一个图形,没有 ax=
参数的 pandas plot 也创建了一个新图形。所以,要么你应该省略 plt.figure()
,要么明确创建一个 ax
来绘制。
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd
datLong = pd.DataFrame({'ctr1': np.repeat(['country 1', 'country 2'], 20),
'x': np.tile(np.arange(20), 2),
'maxx': np.random.randn(40) + 10,
'Price': np.random.randn(40) * 10 + 200})
x_line = datLong.groupby('ctr1').agg({'maxx': ['mean']})
for country in datLong.ctr1.unique():
temp_df = datLong[datLong.ctr1 == country]
ax1 = temp_df.plot(kind='scatter', x='x', y='Price', color='#d95f0e', label='xx', linewidth=3, alpha=0.7,
figsize=(7, 4))
ax1.figure.canvas.set_window_title(country)
ax1.set_title(country)
ax1.axvline(x=x_line.loc[country][0])
plt.show()
由于 groupby
已经为每个国家/地区创建了数据框,您可以使用 groupby
重写代码(不需要 x_line
):
for country, country_df in datLong.groupby('ctr1'):
ax1 = country_df.plot(kind='scatter', x='x', y='Price', color='#d95f0e', label='xx', linewidth=3, alpha=0.7,
figsize=(7, 4))
ax1.figure.canvas.set_window_title(country)
ax1.set_title(country)
ax1.axvline(x=country_df['maxx'].mean())
plt.show()
我正在尝试根据数据框的一列在散点图中添加一条水平线 - 我收到以下错误:ValueError:DataFrame 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
x_line = datLong.groupby('ctr1').agg({'maxx': ['mean']})
for country in datLong.ctr1.unique():
temp_df = plt.figure(country)
temp_df = datLong[datLong.ctr1 == country]
ax1 = temp_df.plot(kind='scatter', x='x', y='Price', color='#d95f0e', label = 'xx', linewidth =3, alpha = 0.7, figsize=(7,4))
plt.title(country)
plt.axvline(x=x_line) ### this is the line that is causing this error
plt.show()
print (ax1)
问题似乎与数据框有关。但我能弄清楚它是什么?谁能帮帮我
x_line
包含所有国家/地区的值。使用 x_line.loc[country]
您将获得该国家/地区的值。因为它 returns 一个数组(只有一个元素),并且 axvline
只接受单个值,所以你可以 select 它的第一个元素 (x_line.loc[country][0]
).
请注意,plt.figure
创建了一个图形,没有 ax=
参数的 pandas plot 也创建了一个新图形。所以,要么你应该省略 plt.figure()
,要么明确创建一个 ax
来绘制。
from matplotlib import pyplot as plt
import numpy as np
import pandas as pd
datLong = pd.DataFrame({'ctr1': np.repeat(['country 1', 'country 2'], 20),
'x': np.tile(np.arange(20), 2),
'maxx': np.random.randn(40) + 10,
'Price': np.random.randn(40) * 10 + 200})
x_line = datLong.groupby('ctr1').agg({'maxx': ['mean']})
for country in datLong.ctr1.unique():
temp_df = datLong[datLong.ctr1 == country]
ax1 = temp_df.plot(kind='scatter', x='x', y='Price', color='#d95f0e', label='xx', linewidth=3, alpha=0.7,
figsize=(7, 4))
ax1.figure.canvas.set_window_title(country)
ax1.set_title(country)
ax1.axvline(x=x_line.loc[country][0])
plt.show()
由于 groupby
已经为每个国家/地区创建了数据框,您可以使用 groupby
重写代码(不需要 x_line
):
for country, country_df in datLong.groupby('ctr1'):
ax1 = country_df.plot(kind='scatter', x='x', y='Price', color='#d95f0e', label='xx', linewidth=3, alpha=0.7,
figsize=(7, 4))
ax1.figure.canvas.set_window_title(country)
ax1.set_title(country)
ax1.axvline(x=country_df['maxx'].mean())
plt.show()