如何在重叠图中对齐直方图bin边缘

我已经设法将两个直方图叠加在一起,但是如果您仔细观察,这些条形开始倾斜并且不会完全重叠。

我已经调整了线宽和宽度,并没有改善它。

我的目标是让所有的条形排列在彼此的顶部,而没有黑色边缘的倾斜。

任何想法如何解决这一问题

这是我的代码:

import matplotlib.pyplot as plt
import numpy

True_Distance = sort_by_Distance_below_4kpc_and_retrabmag_no_99s["true distance"].tolist()
Retr_Distance = sort_by_Distance_below_4kpc_and_retrabmag_no_99s["retrieved distance from observed parallax"].tolist()


plt.figure(figsize=(8,6))
plt.hist(True_Distance, normed=True, bins = 40, alpha=0.75, color = "mediumorchid", label="True Distance", edgecolor='black', linewidth=0.1, width=200)
plt.hist(Retr_Distance, normed=True, bins = 20, alpha=0.5, color = "lightskyblue", label="Retrieved Distance", edgecolor='black', linewidth=0.1, width=200)

# Add title and axis names
plt.title('Number distribution of stars with distance')
plt.xlabel('Distance (parsecs)')
plt.ylabel('Number of stars')
plt.legend()

以下是输出:

回答

  • 有几种方法可以处理 bin 边缘对齐
    1. 如果'distance'类别(例如'methods')和值以整洁的格式单独提供seaborn.histplot,则在使用该hue参数时,API 将正确对齐各个类别的 bin 边缘。
      • 要使用此选项,您的列必须堆叠,因此测量方法在一列中,距离在另一列中,这可以使用以下代码行完成。
      • df = sort_by_Distance_below_4kpc_and_retrabmag_no_99s[['true distance', 'retrieved distance from observed parallax']].stack().reset_index(level=1).rename(columns={'level_1': 'method', 0: 'distance'})
    2. 正如JohanC在评论中所述,如果您单独绘制数据,如 OP 中所示,则必须指定 bin 边缘。
  • seaborn是用于matplotlib.
  • 此示例的数据集是从seaborn示例数据集导入的,并在NASA Exoplanet Explorations 中进行了解释。距离地球是光年。

示例数据和导入

  • plants数据集与您的星距数据集非常吻合。在这里, 有几个值'method'
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams["patch.force_edgecolor"] = True

# import some test data
df = sns.load_dataset('planets')

# display(df.head())
            method  number  orbital_period   mass  distance  year
0  Radial Velocity       1         269.300   7.10     77.40  2006
1  Radial Velocity       1         874.774   2.21     56.95  2008
2  Radial Velocity       1         763.000   2.60     19.84  2011
3  Radial Velocity       1         326.030  19.40    110.62  2007
4  Radial Velocity       1         516.220  10.50    119.47  2009

'methods'一起绘制

  • 如您所见,无论如何bins指定,边缘始终对齐
fig, (ax1, ax2, ax3) = plt.subplots(nrows=3, figsize=(10, 10))
data = df[df.distance < 801]
sns.histplot(data=data, x='distance', hue='method', ax=ax1, bins=np.arange(0, 801, 80))
sns.histplot(data=data, x='distance', hue='method', ax=ax2, bins=20)
sns.histplot(data=data, x='distance', hue='method', ax=ax3)

'method'单独选择并绘图

  • ax2当两个数据集的边缘定义相同时,bin 边缘才对齐。
  • 使用 绘图sns.histplot,而不使用hue,“主要”等同于使用绘图plt.hist(...)
    • 有一些不同的默认值。例如bins:如.mwaskom的创建者所指出的,sns.hist使用autoplt.hist默认为 10 。seaborn
# create a dataframe for two values from the method column
radial = data[data.method == 'Radial Velocity']
transit = data[data.method == 'Transit']

fig, (ax1, ax2, ax3) = plt.subplots(nrows=3, figsize=(10, 10))

# number of bins and edges determined by the API
sns.histplot(data=transit, x='distance', color="lightskyblue", ax=ax1)
sns.histplot(data=radial, x='distance', color="mediumorchid", ax=ax1)

# bin edges defined the same for both plots
sns.histplot(data=transit, x='distance', bins=np.arange(0, 801, 40), color="lightskyblue", ax=ax2)
sns.histplot(data=radial, x='distance', bins=np.arange(0, 801, 40), color="mediumorchid", ax=ax2)

# a number of bins is specifice, edges determined by API based on the data
sns.histplot(data=transit, x='distance', bins=20, color="lightskyblue", ax=ax3)
sns.histplot(data=radial, x='distance', bins=20, color="mediumorchid", ax=ax3)


以上是如何在重叠图中对齐直方图bin边缘的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>