Это решение вызывает некоторое загрязнение пространства имен на уровне модуля (три определения, а не только одно), но мне легко следовать.
Я хотел бы написать что-то вроде этого ( ленивая инициализация), но, к сожалению, классы не доступны в теле их собственных определений.
# wouldn't it be nice if we could do this?
class Foo(object):
instance = None
def __new__(cls):
if cls.instance is None:
cls.instance = object()
cls.instance.__class__ = Foo
return cls.instance
Так как это невозможно, мы можем разбить инициализацию и статический экземпляр в
Ожидаемая инициализация:
import random
class FooMaker(object):
def __init__(self, *args):
self._count = random.random()
self._args = args
class Foo(object):
def __new__(self):
return foo_instance
foo_instance = FooMaker()
foo_instance.__class__ = Foo
Ленивая инициализация:
Ижевая инициализация:
import random
class FooMaker(object):
def __init__(self, *args):
self._count = random.random()
self._args = args
class Foo(object):
def __new__(self):
global foo_instance
if foo_instance is None:
foo_instance = FooMaker()
return foo_instance
foo_instance = None
У меня нет данных, поэтому я сделал некоторые из них:
df <- data.frame(x=rnorm(100),y=rnorm(100),z=rep(letters[1:4],each=25))
ggplot(df,aes(x,y))+geom_point()+theme_bw()+facet_wrap(~z)
Чтобы добавить вертикальную линию в x = 1
мы можем использовать geom_vline()
с фреймворком данных, который имеет ту же фасетную переменную (в моем случае z='b'
, но ваш будет levels='major'
):
ggplot(df,aes(x,y))+geom_point()+theme_bw()+facet_wrap(~z)+
geom_vline(data=data.frame(xint=1,z="b"),aes(xintercept=xint),linetype="dotted")
Еще один способ выразить это, что, возможно, проще обобщить (и оставить ненужным форматирование):
ggplot(df, aes(x,y)) +
geom_point() +
facet_wrap(~ z) +
geom_vline(data = subset(df, z == "b"), aes(xintercept = 1))
Ключевыми вещами являются: аспект сначала, а затем украшение граней путем подмножества исходного кадра данных, и, если возможно, поместите детали в новый aes
. Другие примеры аналогичной идеи:
ggplot(df, aes(x,y)) +
geom_point() +
facet_wrap(~ z) +
geom_vline(data = subset(df, z == "b"), aes(xintercept = 1)) +
geom_smooth(data = subset(df, z == "c"), aes(x, y), method = lm, se = FALSE) +
geom_text(data = subset(df, z == "d"), aes(x = -2, y=0, label = "Foobar"))