无法显示 seaborn distplot
Can't display the seaborn distplot
我正在尝试使用 Python
的 seaborn
模块制作直方图和密度图,并且在图上我还试图在模式下绘制一条垂直线。但是,生成的图不显示任何直方图 and/or 密度曲线。我的代码如下:
# a function to compute mode of the histograms shown in Figures `2` and `3` in the paper.
def compute_mode(layer_list):
ax = sns.distplot(layer_list, hist=False, kde=True, kde_kws={'linewidth': 2})
x = ax.lines[0].get_xdata()
y = ax.lines[0].get_ydata()
mode_idx = y.argmax()
mode_x = x[mode_idx]
plt.close()
return mode_x
# function to plot the histogram of the layer lists.
def make_density(layer_list, color):
# Plot formatting
plt.xlabel('Median Stn. MC-Loss')
plt.ylabel('Density')
# Draw the histogram and fit a density plot.
sns.distplot(layer_list, hist = True, kde = True,
kde_kws = {'linewidth': 2}, color=color)
# compute mode of the histogram.
mode_x = compute_mode(layer_list)
# draw a vertical line at the mode of the histogram.
plt.axvline(mode_x, color='blue', linestyle='dashed', linewidth=1.5)
plt.text(mode_x, 0.16, 'mode: {:.4f}'.format(mode_x))
layer_list = [ 1.0,2.0,3.0,4.0,2.0,3.0,1.0,6.0,10.0,2.0]
make_density(layer_list, 'green')
我认为问题出在这条线上
plt.axvline(mode_x, color='blue', linestyle='dashed', linewidth=1.5)
和
plt.text(mode_x, 0.16, 'mode: {:.4f}'.format(mode_x))
.
我做错了什么?
谢谢,
在 compute_mode
中调用 seaborn 的 distplot 而未指定 ax 弄乱了绘图。您可以简单地用此代码替换 compute_mode
:
def compute_mode(layer_list):
dummy_fig, dummy_ax = plt.subplots()
ax = sns.distplot(layer_list, hist=False, kde=True, kde_kws={'linewidth': 2}, ax=dummy_ax)
x = ax.lines[0].get_xdata()
y = ax.lines[0].get_ydata()
mode_idx = y.argmax()
mode_x = x[mode_idx]
plt.close()
return mode_x
即使此变通方法有效,也请考虑使用 scipy's gaussian_kde 等专用工具计算模式。它会防止你乱用图形库来做数学的东西。
主要问题是在 compute_mode()
中调用了 plt.close()
,它关闭了之前在 make_density()
中创建的绘图。请注意 sns.distplot
主要是一个绘图函数,不应仅用于计算。由于 kde 已经在 make_density()
中绘制,ax.lines[0]
可以传递给 compue_mode()
以提取曲线数据,而无需再次创建绘图。
一些其他备注:
- 在 seaborn 0.11 中,
distplot
已被弃用,取而代之的是两个函数:histplot
创建直方图,可选择使用 kde。 displot
(没有“T”)创建了 histogram/kdeplots 的网格。除了名称混淆外,distplot
的kde_kws
参数在histplot
中称为line_kws
,而histplot
中的kde_kws
是函数的意思计算KDE。此外,kde 曲线始终使用与直方图相同的颜色。
- Seaborn 的“轴级别”函数 return 和
ax
可用于额外的格式化。在您的原始代码中,您在调用 distplot
之前添加了一些标签,但由于 distplot
也可能会更改设置,因此在之后进行所有这些格式化调用会更安全。
- 您可能想了解 object-oriented interface 以及
ax.set_xlabel()
和 plt.xlabel()
之间的区别。
import matplotlib.pyplot as plt
import seaborn as sns
# a function to compute mode of the histograms shown in Figures `2` and `3` in the paper.
def compute_mode(line_object):
x = line_object.get_xdata()
y = line_object.get_ydata()
mode_idx = y.argmax()
return x[mode_idx], y[mode_idx]
# function to plot the histogram of the layer lists.
def make_density(layer_list, color):
# Draw the histogram and fit a density plot.
ax = sns.histplot(layer_list, kde=True,
line_kws={'linewidth': 2}, color=color)
# compute mode of the histogram.
mode_x, mode_y = compute_mode(ax.lines[0])
# draw a vertical line at the mode of the histogram.
ax.axvline(mode_x, color='blue', linestyle='dashed', linewidth=1.5)
ax.text(mode_x, mode_y, 'mode: {:.4f}'.format(mode_x))
# Plot formatting
ax.set_xlabel('Median Stn. MC-Loss')
ax.set_ylabel('Density')
layer_list = [1.0, 2.0, 3.0, 4.0, 2.0, 3.0, 1.0, 6.0, 10.0, 2.0]
make_density(layer_list, 'green')
plt.show()
我正在尝试使用 Python
的 seaborn
模块制作直方图和密度图,并且在图上我还试图在模式下绘制一条垂直线。但是,生成的图不显示任何直方图 and/or 密度曲线。我的代码如下:
# a function to compute mode of the histograms shown in Figures `2` and `3` in the paper.
def compute_mode(layer_list):
ax = sns.distplot(layer_list, hist=False, kde=True, kde_kws={'linewidth': 2})
x = ax.lines[0].get_xdata()
y = ax.lines[0].get_ydata()
mode_idx = y.argmax()
mode_x = x[mode_idx]
plt.close()
return mode_x
# function to plot the histogram of the layer lists.
def make_density(layer_list, color):
# Plot formatting
plt.xlabel('Median Stn. MC-Loss')
plt.ylabel('Density')
# Draw the histogram and fit a density plot.
sns.distplot(layer_list, hist = True, kde = True,
kde_kws = {'linewidth': 2}, color=color)
# compute mode of the histogram.
mode_x = compute_mode(layer_list)
# draw a vertical line at the mode of the histogram.
plt.axvline(mode_x, color='blue', linestyle='dashed', linewidth=1.5)
plt.text(mode_x, 0.16, 'mode: {:.4f}'.format(mode_x))
layer_list = [ 1.0,2.0,3.0,4.0,2.0,3.0,1.0,6.0,10.0,2.0]
make_density(layer_list, 'green')
plt.axvline(mode_x, color='blue', linestyle='dashed', linewidth=1.5)
和
plt.text(mode_x, 0.16, 'mode: {:.4f}'.format(mode_x))
.
我做错了什么?
谢谢,
在 compute_mode
中调用 seaborn 的 distplot 而未指定 ax 弄乱了绘图。您可以简单地用此代码替换 compute_mode
:
def compute_mode(layer_list):
dummy_fig, dummy_ax = plt.subplots()
ax = sns.distplot(layer_list, hist=False, kde=True, kde_kws={'linewidth': 2}, ax=dummy_ax)
x = ax.lines[0].get_xdata()
y = ax.lines[0].get_ydata()
mode_idx = y.argmax()
mode_x = x[mode_idx]
plt.close()
return mode_x
即使此变通方法有效,也请考虑使用 scipy's gaussian_kde 等专用工具计算模式。它会防止你乱用图形库来做数学的东西。
主要问题是在 compute_mode()
中调用了 plt.close()
,它关闭了之前在 make_density()
中创建的绘图。请注意 sns.distplot
主要是一个绘图函数,不应仅用于计算。由于 kde 已经在 make_density()
中绘制,ax.lines[0]
可以传递给 compue_mode()
以提取曲线数据,而无需再次创建绘图。
一些其他备注:
- 在 seaborn 0.11 中,
distplot
已被弃用,取而代之的是两个函数:histplot
创建直方图,可选择使用 kde。displot
(没有“T”)创建了 histogram/kdeplots 的网格。除了名称混淆外,distplot
的kde_kws
参数在histplot
中称为line_kws
,而histplot
中的kde_kws
是函数的意思计算KDE。此外,kde 曲线始终使用与直方图相同的颜色。 - Seaborn 的“轴级别”函数 return 和
ax
可用于额外的格式化。在您的原始代码中,您在调用distplot
之前添加了一些标签,但由于distplot
也可能会更改设置,因此在之后进行所有这些格式化调用会更安全。 - 您可能想了解 object-oriented interface 以及
ax.set_xlabel()
和plt.xlabel()
之间的区别。
import matplotlib.pyplot as plt
import seaborn as sns
# a function to compute mode of the histograms shown in Figures `2` and `3` in the paper.
def compute_mode(line_object):
x = line_object.get_xdata()
y = line_object.get_ydata()
mode_idx = y.argmax()
return x[mode_idx], y[mode_idx]
# function to plot the histogram of the layer lists.
def make_density(layer_list, color):
# Draw the histogram and fit a density plot.
ax = sns.histplot(layer_list, kde=True,
line_kws={'linewidth': 2}, color=color)
# compute mode of the histogram.
mode_x, mode_y = compute_mode(ax.lines[0])
# draw a vertical line at the mode of the histogram.
ax.axvline(mode_x, color='blue', linestyle='dashed', linewidth=1.5)
ax.text(mode_x, mode_y, 'mode: {:.4f}'.format(mode_x))
# Plot formatting
ax.set_xlabel('Median Stn. MC-Loss')
ax.set_ylabel('Density')
layer_list = [1.0, 2.0, 3.0, 4.0, 2.0, 3.0, 1.0, 6.0, 10.0, 2.0]
make_density(layer_list, 'green')
plt.show()