ggplot2: добавить hline только к одной сетке [duplicate]

Это решение вызывает некоторое загрязнение пространства имен на уровне модуля (три определения, а не только одно), но мне легко следовать.

Я хотел бы написать что-то вроде этого ( ленивая инициализация), но, к сожалению, классы не доступны в теле их собственных определений.

# 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
8
задан maximusdooku 8 January 2016 в 22:17
поделиться

2 ответа

У меня нет данных, поэтому я сделал некоторые из них:

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")

13
ответ дан Sam Dickson 20 August 2018 в 17:30
поделиться
  • 1
    Трудно было найти. Должно было сделать это красным, может быть. – Mike Wise 8 January 2016 в 23:45

Еще один способ выразить это, что, возможно, проще обобщить (и оставить ненужным форматирование):

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"))
0
ответ дан ngm 20 August 2018 в 17:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: