同一海运散点图上的两个或多个pandas列

pdsfdshx  于 2023-05-27  发布在  其他
关注(0)|答案(3)|浏览(137)

我正在尝试为以下数据绘制散点图,所有列都在一个图中。

实际上,我从csv文件导入此数据并保存在dataframe df_inv中,然后将其保存在变量提示中

tips = df_inv
sns.scatterplot(data=tips, x=df_inv.index, y = "a")
plt.show()

我想在同一图上添加列B、c和d,但我无法找到正确的代码。我试过y = ["a", "b", "c", "d", "e"],但它没有工作。我希望我的结果在以下格式理想的不是所有的圆,但一些x,*,和其他形状。

wn9m85ua

wn9m85ua1#

另一种解决方案,如果你不想重塑数据框,将调用sns.scatterplot几次,每次与一个不同的列,你想在y参数绘图。然后,每一列都将绘制在第一次调用将生成的相同轴上。您可以创建要在每次调用时使用的颜色和标记列表,也可以手动创建图例。下面是示例代码,使用df_inv数据框中的所有列(带有一些随机生成的数据)。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import random
import matplotlib.lines as mlines

df_inv = pd.DataFrame({'a': random.sample(range(300, 400), 5),
                       'b': random.sample(range(100, 200), 5),
                       'c': random.sample(range(40, 90), 5)},
                      index=range(1,6))

markers = ['o', 'x', 'd']
colors = ['purple', 'cyan', 'green']
legend_handles = []

for i, col_name in enumerate(df_inv.columns):
    sns.scatterplot(data=df_inv, x=df_inv.index, y=col_name,
                    marker=markers[i], color=colors[i], s=100) # s = marker size
    legend_handles.append(mlines.Line2D([], [], color=colors[i], marker=markers[i],
                                        linestyle='None', markersize=8, label=col_name))
plt.ylabel('Value')
plt.xlabel('Index')
plt.grid()
plt.legend(handles=legend_handles, bbox_to_anchor=(1.02, 1), title='Column')
plt.tight_layout()
plt.show()

代码结果:

5q4ezhmt

5q4ezhmt2#

您可以使用pandas.melt在不同的 Dataframe 中重新塑造数据:

df_inv = df_inv.reset_index()
columns = ['index', 'a', 'b', 'c', 'd']
df_to_plot = df_inv[columns]

df_to_plot = pd.melt(frame = df_to_plot,
                     id_vars = 'index',
                     var_name = 'column_name',
                     value_name = 'value')

通过这种方式,您将得到类似于:

index column_name  value
0       0           a    315
1       1           a    175
2       2           a     65
3       3           a    370
4       4           a    419
5       0           b    173
6       1           b    206
7       2           b    271
8       3           b    463
9       4           b    419
10      0           c     58
...

现在你终于可以用一行代码来绘图了:

sns.scatterplot(ax = ax, data = df_to_plot, x = 'index', y = 'value', style = 'column_name', hue = 'column_name')

完整代码

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

N = 5
df_inv = pd.DataFrame()
df_inv['a'] = np.random.randint(low = 50, high = 500, size = N)
df_inv['b'] = np.random.randint(low = 50, high = 500, size = N)
df_inv['c'] = np.random.randint(low = 50, high = 500, size = N)
df_inv['d'] = np.random.randint(low = 50, high = 500, size = N)

df_inv = df_inv.reset_index()
columns = ['index', 'a', 'b', 'c', 'd']
df_to_plot = df_inv[columns]

df_to_plot = pd.melt(frame = df_to_plot,
                     id_vars = 'index',
                     var_name = 'column_name',
                     value_name = 'value')

fig, ax = plt.subplots()

sns.scatterplot(ax = ax, data = df_to_plot, x = 'index', y = 'value', style = 'column_name', hue = 'column_name')

plt.show()

e5njpo68

e5njpo683#

  • sns.scatterplot接受宽格式或长格式的数据。
  • 对于此OP,最简单的解决方案是以当前宽格式传递 Dataframe 。
  • 数据:pandas.DataFramenumpy.ndarrayMap序列。输入数据结构。可以是可分配给命名变量的长格式向量集合,也可以是将在内部整形的宽格式数据集。
  • data=df[['a', 'b', 'c', 'd']]data=df,分别用于选定列或所有列。
    *python 3.11.2pandas 2.0.1matplotlib 3.7.1seaborn 0.12.2中测试
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# sample dataframe
np.random.seed(2023)
df = pd.DataFrame(data=np.random.randint(low=50, high=500, size=(5, 5)), columns=['a', 'b', 'c', 'd', 'e'])

# create a figure and axes
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4))

# plot selected columns
sns.scatterplot(data=df[['a', 'b', 'c', 'd']], ax=ax1, legend=False)
ax1.set(title='Selected Columns Plotted - No Purple ♦')

# plot all columns
sns.scatterplot(data=df, ax=ax2)
ax2.set(title='All Columns Plotted')

# move legend for cosmetics
sns.move_legend(ax2, bbox_to_anchor=(1, 0.5), loc='center left', frameon=False)

df

a    b    c    d    e
0  393   75  233  467  270
1   53  422  102  407  328
2  451  289  487  481  383
3   89  266  292  181  108
4   78  259  160  249  113

相关问题