使用Seaborn将y轴值限制为1的问题

时间:2019-07-12 21:40:02

标签: python matplotlib seaborn axis

我正在使用seaborn进行分类点图绘制,并且为日期分配了面积值(km2)。

当我绘制这些日期时,当我知道有多个高于1的值时,y轴从0限制为1。

import numpy as np
import pandas as pd

import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.pyplot import figure


# Read in the backscatter csv file as a data frame
df_lakearea = pd.read_csv('lake_area.csv')

figure(num=None, figsize=(8, 6), dpi=300, facecolor='w', edgecolor='k')

# Control aesthetics 
sns.set()
sns.set(style="whitegrid", rc={"grid.linewidth": 0.2, "lines.linewidth": 0.5}) # White grid background, width of grid  line and series line
sns.set_context(font_scale = 0.5) # Scale of font

# Use seaborn pointplot function to plot the lake area 
lakearea_plot = sns.pointplot(x="variable", y="value", data=pd.melt(df_lakearea), color='maroon', linestyles=["-"], join="True", capsize=0.2)
# Use the pd.melt function to converts the wide-form data frame to long-form.

# Rotate the x axis labels so that they are readable
plt.setp(lakearea_plot.get_xticklabels(), rotation=20)

params = {'mathtext.default': 'regular' }
plt.rcParams.update(params)

lakearea_plot.set(xlabel='', ylabel='Area $(km^2)$')
lakearea_plot.tick_params(labelsize=8) # Control the label size

我希望结果看起来很像正常的时间序列图,将值分配给每个日期,误差线达到最小和最大点,而在y轴上最大值不为1。下图显示了我所拥有的,y轴最大值为1。

What I have so far

谢谢。

1 个答案:

答案 0 :(得分:-1)

首先,当您在seaborn中绘制分类点图时,您的y值(数值)将根据每个类别汇总到均值。让我们使用一个seaborn的数据集进行演示。

import seaborn as sns

df = sns.load_dataset('tips')
sns.pointplot(x='day', y='tip', data=df)

enter image description here

在此图中,您可以看到Thur的y值约为2.8,这是因为Thur上的笔尖平均值为2.8-ish。我们可以通过以下方式进行验证:

df.groupby('day').tip.mean()

[Out]:
day
Thur    2.771452
Fri     2.734737
Sat     2.993103
Sun     3.255132
Name: tip, dtype: float64

第二,您可能还已经注意到Fri的置信区间(CI)比其他组大。实际上,这种线图中CI的大小表示您的样本大小,而不是数据分布。我们可以通过以下方式进行验证:

df.day.value_counts()

[Out]:
df.day.value_counts()
Sat     87
Sun     76
Thur    62
Fri     19
Name: day, dtype: int64

如您所见,我们的数据集中只有19个与Fri相关的观测值。因此,与其他组相比,我们对我们的估计(均值)“信心不足”。这就是为什么它具有比其他团体更广泛的CI的原因。

这是另一个例子:

sns.regplot(x='total_bill', y='tip', data=df)

enter image description here

您可以说CI大约宽50,因为那里只有几个数据点。

因此,您应该检查数据中每个组的平均值是否在y轴范围内,并且CI是否代表每个组中数据点的数量。