如何散点图每组 pandas DataFrame
How to scatter plot each group of a pandas DataFrame
我正在用 seaborn 的间歇泉数据集制作散点图。我正在根据 'kind' 列对点进行着色,但出于某种原因,图例仅显示 'long' 而未显示 'short'。我不知道我错过了什么。我还想知道是否有一种更简单的方法来对不使用 for 循环的数据进行颜色编码。谢谢!
x = geyser_df['waiting']
y = geyser_df['duration']
col = []
for i in range(len(geyser_df)):
if (geyser_df['kind'][i] == 'short'):
col.append('MediumVioletRed')
elif(geyser_df['kind'][i] == 'long'):
col.append('Navy')
plt.scatter(x, y, c=col)
plt.legend(('long','short'))
plt.xlabel('Waiting')
plt.ylabel("Duration")
plt.suptitle("Waiting vs Duration")
plt.show()
您将 x = geyser_df ['waiting']
和 y = geyser_df ['duration']
作为单个数据集传递,这导致 plt.scatter
仅用作 label="long"
作为图例。我没有足够的经验使用这种类型的 库 但要重现您描述的示例,您需要编写这样的程序:
long = [[], []]
short = [[], []]
col=['MediumVioletRed', 'Navy']
for i in range(len(geyser_df["kind"])):
if (geyser_df["kind"][i] == "long"):
long[0].append([geyser_df['waiting'][i]])
long[1].append([geyser_df['duration'][i]])
else:
short[0].append([geyser_df['waiting'][i]])
short[1].append([geyser_df['duration'][i]])
plt.scatter(long[0], long[1], c=col[1], label="long")
plt.scatter(short[0], short[1], c=col[0], label="short")
plt.legend()
plt.xlabel('Waiting')
plt.ylabel("Duration")
plt.suptitle("Waiting vs Duration")
plt.show()
- 使用 pandas 执行此操作的正确方法是使用
pandas.DataFrame.groupby
and pandas.DataFrame.plot
.
- 测试于
python 3.8.12
、pandas 1.3.4
、matplotlib 3.4.3
、seaborn 0.11.2
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# load data
df = sns.load_dataset('geyser')
# plot
fig, ax = plt.subplots(figsize=(6, 4))
colors = {'short': 'MediumVioletRed', 'long': 'Navy'}
for kind, data in df.groupby('kind'):
data.plot(kind='scatter', x='waiting', y='duration', label=kind, color=colors[kind], ax=ax)
ax.set(xlabel='Waiting', ylabel='Duration')
fig.suptitle('Waiting vs Duration')
plt.show()
- 最简单的方法是使用
seaborn
,一个用于 matplotlib 的高级 API,其中 hue
用于按颜色分隔组。
sns.scatterplot
:轴级图
sns.relplot
:图级绘图,其中 kind='scatter'
是默认绘图样式
fig, ax = plt.subplots(figsize=(6, 4))
colors = {'short': 'MediumVioletRed', 'long': 'Navy'}
sns.scatterplot(data=df, x='waiting', y='duration', hue='kind', palette=colors, ax=ax)
ax.set(xlabel='Waiting', ylabel='Duration')
fig.suptitle('Waiting vs Duration')
plt.show()
colors = {'short': 'MediumVioletRed', 'long': 'Navy'}
p = sns.relplot(data=df, x='waiting', y='duration', hue='kind', palette=colors, height=4, aspect=1.5)
ax = p.axes.flat[0] # extract the single subplot axes
ax.set(xlabel='Waiting', ylabel='Duration')
p.fig.suptitle('Waiting vs Duration', y=1.1)
plt.show()
我正在用 seaborn 的间歇泉数据集制作散点图。我正在根据 'kind' 列对点进行着色,但出于某种原因,图例仅显示 'long' 而未显示 'short'。我不知道我错过了什么。我还想知道是否有一种更简单的方法来对不使用 for 循环的数据进行颜色编码。谢谢!
x = geyser_df['waiting']
y = geyser_df['duration']
col = []
for i in range(len(geyser_df)):
if (geyser_df['kind'][i] == 'short'):
col.append('MediumVioletRed')
elif(geyser_df['kind'][i] == 'long'):
col.append('Navy')
plt.scatter(x, y, c=col)
plt.legend(('long','short'))
plt.xlabel('Waiting')
plt.ylabel("Duration")
plt.suptitle("Waiting vs Duration")
plt.show()
您将 x = geyser_df ['waiting']
和 y = geyser_df ['duration']
作为单个数据集传递,这导致 plt.scatter
仅用作 label="long"
作为图例。我没有足够的经验使用这种类型的 库 但要重现您描述的示例,您需要编写这样的程序:
long = [[], []]
short = [[], []]
col=['MediumVioletRed', 'Navy']
for i in range(len(geyser_df["kind"])):
if (geyser_df["kind"][i] == "long"):
long[0].append([geyser_df['waiting'][i]])
long[1].append([geyser_df['duration'][i]])
else:
short[0].append([geyser_df['waiting'][i]])
short[1].append([geyser_df['duration'][i]])
plt.scatter(long[0], long[1], c=col[1], label="long")
plt.scatter(short[0], short[1], c=col[0], label="short")
plt.legend()
plt.xlabel('Waiting')
plt.ylabel("Duration")
plt.suptitle("Waiting vs Duration")
plt.show()
- 使用 pandas 执行此操作的正确方法是使用
pandas.DataFrame.groupby
andpandas.DataFrame.plot
. - 测试于
python 3.8.12
、pandas 1.3.4
、matplotlib 3.4.3
、seaborn 0.11.2
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# load data
df = sns.load_dataset('geyser')
# plot
fig, ax = plt.subplots(figsize=(6, 4))
colors = {'short': 'MediumVioletRed', 'long': 'Navy'}
for kind, data in df.groupby('kind'):
data.plot(kind='scatter', x='waiting', y='duration', label=kind, color=colors[kind], ax=ax)
ax.set(xlabel='Waiting', ylabel='Duration')
fig.suptitle('Waiting vs Duration')
plt.show()
- 最简单的方法是使用
seaborn
,一个用于 matplotlib 的高级 API,其中hue
用于按颜色分隔组。sns.scatterplot
:轴级图sns.relplot
:图级绘图,其中kind='scatter'
是默认绘图样式
fig, ax = plt.subplots(figsize=(6, 4))
colors = {'short': 'MediumVioletRed', 'long': 'Navy'}
sns.scatterplot(data=df, x='waiting', y='duration', hue='kind', palette=colors, ax=ax)
ax.set(xlabel='Waiting', ylabel='Duration')
fig.suptitle('Waiting vs Duration')
plt.show()
colors = {'short': 'MediumVioletRed', 'long': 'Navy'}
p = sns.relplot(data=df, x='waiting', y='duration', hue='kind', palette=colors, height=4, aspect=1.5)
ax = p.axes.flat[0] # extract the single subplot axes
ax.set(xlabel='Waiting', ylabel='Duration')
p.fig.suptitle('Waiting vs Duration', y=1.1)
plt.show()