我正在尝试绘制一个带有堆积条形图的 facet_grid。
我想使用 Seaborn。它的 barplot 函数不包含堆叠参数。
我尝试将 FacetGrid.map 与自定义可调用函数一起使用。
import pandas as pd
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
def custom_stacked_barplot(col_day, col_time, col_total_bill, **kwargs):
dict_df={}
dict_df['day']=col_day
dict_df['time']=col_time
dict_df['total_bill']=col_total_bill
df_data_graph=pd.DataFrame(dict_df)
df = pd.crosstab(index=df_data_graph['time'], columns=tips['day'], values=tips['total_bill'], aggfunc=sum)
df.plot.bar(stacked=True)
tips=sns.load_dataset("tips")
g = sns.FacetGrid(tips, col='size', row='smoker')
g = g.map(custom_stacked_barplot, "day", 'time', 'total_bill')
Run Code Online (Sandbox Code Playgroud)
但是,我分别得到了一个空画布和堆积条形图。
空画布:
Graph1分开:
图2:。
我该如何解决这个问题?谢谢您的帮助!
我想从刻面ggplot2图中有选择地删除不必要的刻面。我看了这个问题,但不知道该怎么做(也许现在的建议已经过时了):
这是一个最小的例子。我想删除右下角的空白区域(b,2)。
library('ggplot2')
d <- data.frame('factor_1' = factor(c('a', 'a', 'b')),
'factor_2' = factor(c('1', '2', '1')),
x = 1:3, y = 1:3)
ggplot(data = d, mapping = aes(x = x, y = y)) +
geom_point() +
facet_grid(facets = factor_1 ~ factor_2, drop = TRUE)
Run Code Online (Sandbox Code Playgroud)
显然drop = TRUE这里没有任何作用,因为没有未使用的因子水平,而只有其未使用的组合。
我正在尝试将小平面条移动到我的绘图的最左侧,以便标签位于条形图旁边,并且分组条带位于其左侧(请参阅下面的示例).
我认为这必须使用Grobs完成,但我对这种操作水平几乎没有经验,并且会很感激指导.
数据:
structure(list(dept = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L,
1L, 1L, 1L, 1L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 5L, 5L, 5L, 5L, 5L, 5L, 5L,
5L, 5L, 5L), .Label = c("Distribution Centre Services", "IT",
"Marketing", "Merchandise & Inventory", "Operations and Communication"
), class = "factor"), label = c("test 25", "test 23", "test 24",
"test 27", "test 26", "test 28", "test 29", …Run Code Online (Sandbox Code Playgroud) 首先,为这个例子道歉,但我找不到更好的数据集来证明这个问题。希望,这就足够了。假设我正在尝试从mtcars绘制 mpg 与位移的数据集中制作一个传动方面的网格(自动与手动)和齿轮数,如下所示:
# Load library
library(ggplot2)
# Load data
data(mtcars)
# Plot data
p <- ggplot(mtcars,aes(x = disp, y = mpg)) + geom_point() + facet_grid(gear ~ am)
p <- p + geom_smooth()
print(p)
Run Code Online (Sandbox Code Playgroud)
这使,
注意,我添加了一条趋势线geom_smooth,它默认使用黄土曲线。我可以拟合用户定义的函数而不是nls用于该方法的黄土曲线 ,然后陈述一个公式,这很棒。但是是否可以为每个方面拟合不同的用户指定曲线?例如,左上角的线性回归和右下角的衰减指数。这可能吗?还是我用锤子打螺丝?
编辑:此处给出了自定义(即用户定义)拟合函数的解决方案。
例如,
library(ggplot2)
ggplot(mpg, aes(displ, cty)) + geom_point() + facet_grid(cols = vars(drv))
Run Code Online (Sandbox Code Playgroud)
如何更改条带和主图之间的距离?(例如,在条带和主图之间创建一个间隙。)
但我不需要更改条带大小(与此编辑条带大小 ggplot2 不同)。
我想使用ggplot2's创建一个图形facet_grid,如下所示:
# Load ggplot2 library for plotting
library(ggplot2)
# Plot dummy data
p <- ggplot(mtcars, aes(mpg, wt))
p <- p + geom_point()
p <- p + facet_grid(gear ~ cyl)
print(p)
Run Code Online (Sandbox Code Playgroud)

这很好,但由于它出现在期刊文章中,因此每个面板也需要标有 a、b、c 等。该包egg有一个很好的函数调用tag_facet,其用法如下:
# Load egg library for tagging
library(egg)
#> Warning: package 'egg' was built under R version 3.5.3
#> Loading required package: gridExtra
# Same plot but with tags for each facet
p <- ggplot(mtcars, aes(mpg, wt))
p <- p …Run Code Online (Sandbox Code Playgroud) 我正在创建一个类似于以下的图矩阵
ggplot(mpg, aes(displ, hwy)) + geom_point() + facet_grid(rows = vars(cyl), cols = vars(drv))
Run Code Online (Sandbox Code Playgroud)
现在,我想有一些方法来突出显示一些单独的图,例如那些cyl是 5 或 6 以及drv是 的图f。因此,理想情况下,这可能看起来像这样:
但我也很高兴那些面板通过设置ggtheme为经典或类似而具有不同的外观。
然而,我非常不清楚如何修改通过生成的图矩阵中单独选择的图facet_grid
我想在每个子图中添加一条垂直线来标记每个产品的单独发布日期。每条垂直线都应显示日期。但我太初学者了,无法弄清楚这一点。我试着.axvline举个例子:
这是代码:
g = sns.FacetGrid(df2, col='Product', hue='Vendor', col_wrap=4, height=3.5)
g = g.map(plt.plot, 'Date', 'Volumes')
g = g.map(plt.fill_between, 'Date', 'Volumes', alpha=0.2).set_titles("{col_name} Product")
g = g.set_titles("{col_name}")
g = g.set(xticks=[0, 12, 23])
g = g.set(xlabel='')
plt.axvline(x='Apr 19', color='r', linestyle=':')
Run Code Online (Sandbox Code Playgroud)
我发现了以下方法,但我无法真正理解它,或将其应用于我自己的目的:
根据事件的发生向 Seaborn Facet Grid 图添加垂直线
我创建了两个包含产品名称和相应发布日期的列表:
product_names = ['Product A', 'Product B','Product C', 'Product D','Product E', 'Product F',
'Product G', 'Product H','Product I', 'Product J',]
launch_dates = ['2019-02-01', '2019-09-01', '2019-12-01', '2019-12-01',
'2020-02-01', '2020-05-01', '2020-07-01', '2020-07-01',
'2020-08-01', '2020-07-15']
launch_dates = [datetime.strptime(d, …Run Code Online (Sandbox Code Playgroud) 在 Seaborn FacetGrid 中,如何让 y 轴刻度标签显示在所有子图中,无论是否显示sharey=True?
tips = sns.load_dataset("tips")
g = sns.FacetGrid(tips, col="time", row="sex")
g.map(sns.scatterplot, "total_bill", "tip")
Run Code Online (Sandbox Code Playgroud)
以下尝试返回错误AttributeError: 'FacetGrid' object has no attribute 'flatten'
for axis in g.flatten():
for tick in axis.get_yticklabels():
tick.set_visible(True)
Run Code Online (Sandbox Code Playgroud) 有没有办法创建一个 Seaborn 线图,所有线均为灰色,平均值为红线?我正在尝试执行此操作,relplot但我不知道如何将平均值与数据分开(并且似乎未绘制平均值?)。
制作可重复的数据框
np.random.seed(1)
n1 = 100
n2 = 10
idx = np.arange(0,n1*2)
x, y, cat, id2 = [], [], [], []
x1 = list(np.random.uniform(-10,10,n2))
for i in idx:
x.extend(x1)
y.extend(list(np.random.normal(loc=0, scale=0.5, size=n2)))
cat.extend(['A', 'B'][i > n1])
id2.append(idx[i])
id2 = id2 * n2
id2.sort()
df1 = pd.DataFrame(list(zip(id2, x, y, cat)),
columns =['id2', 'x', 'y', 'cat']
)
Run Code Online (Sandbox Code Playgroud)
绘图尝试
g = sns.relplot(
data=df1, x='x', y='y', hue='id2',
col='cat', kind='line',
palette='Greys',
facet_kws=dict(sharey=False,
sharex=False
),
legend=False
)
Run Code Online (Sandbox Code Playgroud)
facet-grid ×10
ggplot2 ×6
r ×6
python ×4
seaborn ×4
facet ×1
facet-wrap ×1
geom-bar ×1
matplotlib ×1
relplot ×1