合并具有镜像值的数据帧

Merge dataframes with mirrored values

我有一个存储圆形区域测量点的数据框。所以每个点都有一个 Radius_mmAngle_deg 值。

作为数据的可视化表示,我现在想创建一个穿过表面的截面。 IE。我选择一个角和与其成 180° 的相应角,包括圆心。 x 轴应显示 Radius_mm,y 轴应显示 Value.

我几乎可以将其存档,如下所示。通过分别绘制每个数据集,不幸的是结果没有连接。我确信有更优雅的方法,但无法实现,有什么帮助吗?

谢谢!

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame(
    {
        "Point": (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15),
        "Radius_mm": (0, 0.5, 0.5, 0.75, 0.75, 1.25, 1.25, 1.75, 1.75, 2, 2, 2.25, 2.25, 2.5, 2.5),
        "Angle_deg": (0, 45, 225, 45, 225, 45, 225, 45, 225, 45, 225, 45, 225, 45, 225),
        "Value": (70, 68, 66.75, 68.08, 66.72, 68.44, 67.31, 68.82, 68.02, 68.93, 68.41, 69.39, 68.3, 68.54, 68.55),
    }
)

# first angle
filtered_df = df.loc[df["Angle_deg"] == 45]

# second angle = first angle + 180°
filtered_df2 = df.loc[df["Angle_deg"] == 225]
# x values ("mirrored")
xvalues_for_mirrored_angle = [x*-1 for x in filtered_df2["Radius_mm"].tolist()]

# center value
filtered_df3 = df.loc[df["Angle_deg"] == 0]
xvalue_center = [x for x in filtered_df3["Radius_mm"].tolist()]

# combining x axis values
xtick_values = xvalues_for_mirrored_angle + xvalue_center +  filtered_df["Radius_mm"].tolist()


fig, ax = plt.subplots()

ax.plot("Radius_mm", "Value", data=filtered_df, marker="+", label=(f"Angle = 45"))
ax.plot(xvalues_for_mirrored_angle, "Value", data=filtered_df2, marker="+", label=(f"Angle = 225"))
ax.plot("Radius_mm", "Value", data=filtered_df3, marker="+", label=(f"Angle = Center"))

ax.grid(True)
ax.set_xticks(xtick_values)
ax.set_xticklabels(xtick_values, rotation = 45)
ax.set_xlabel("Radius")
ax.legend(fontsize=10)
fig.tight_layout()
plt.show()

您不需要 filtered_dfs,您可以在几行 Pandas 中完成大部分工作,并保持线路连接:

df = pd.DataFrame(...  # as above

df.loc[df.Angle_deg==225, 'Radius_mm'] *= -1  # flip the reverse angle
df = df.sort_values(by='Radius_mm')

然后剧情:

df.plot(x='Radius_mm', y='Value', marker='+', legend=False, grid=True, xlabel='radius', xticks=df['Radius_mm'], rot=45);

如果你想保持颜色分开,你可以用这个替换最后一行:

f, ax = plt.subplots()
ax.plot("Radius_mm", "Value", data=df, marker="+", label=(f"Angle = 0"))
ax.plot("Radius_mm", "Value", data=df[df["Angle_deg"] == 45], marker="+", label=(f"Angle = 45"))
ax.plot("Radius_mm", "Value", data=df[df["Angle_deg"] == 225], marker="+", label=(f"Angle = 225"))
ax.grid(True)
ax.set_xticks(df["Radius_mm"])
ax.set_xticklabels(df["Radius_mm"], rotation = 45)
ax.set_xlabel("Radius")
ax.legend(fontsize=10)
f.tight_layout()
plt.show()