我需要从数据框中绘制一个图,但我不知道如何绘制。所以我的理想图是这样的,这意味着每个 x 轴提供多个值(并且它们绝对不能互相覆盖)。
以下代码用于创建一个随机数据框,因此您可以尝试一下。如果有人能帮助我,我将不胜感激!!!
import pandas as pd import numpy as np random_data = np.random.randint(10,25,size=(5,3)) df = pd.DataFrame(random_data, columns=['Column_1','Column_2','Column_3']) print(df)
实际上我的数据看起来像这样,所以这意味着有 a 到 k 列,每列都有 8 个值(其中一些是空的)
用您提供的玩具数据框,可以采用以下方法实现:
# Prepare data for plotting new_df = pd.concat( [ pd.DataFrame( { "x": [i + j * 10 - 1 for i in range(1, len(df[col]) + 1)], "value": df[col], "label": col, } ) for j, col in enumerate(df.columns) ] ).reset_index(drop=True) print(new_df) # Output x value label 0 0 14 Column_1 1 1 22 Column_1 2 2 20 Column_1 3 3 11 Column_1 4 4 21 Column_1 5 10 18 Column_2 6 11 17 Column_2 7 12 21 Column_2 8 13 18 Column_2 9 14 15 Column_2 10 20 19 Column_3 11 21 18 Column_3 12 22 24 Column_3 13 23 17 Column_3 14 24 14 Column_3
然后,你可以像这样绘制:
from matplotlib import pyplot as plt fig, ax = plt.subplots(nrows=1, ncols=1) # Remove borders ax.spines["right"].set_visible(False) ax.spines["top"].set_visible(False) # Position labels on x-axis ax.set_xticks( ticks=[ new_df.loc[new_df["label"] == label, "x"].median() for label in new_df["label"].unique() ] ) ax.set_xticklabels(new_df["label"].unique(), fontsize=12) # Plot values for label in new_df["label"].unique(): ax.scatter( new_df.loc[new_df["label"] == label, "x"], new_df.loc[new_df["label"] == label, "value"], ) plt.show()
输出: