ggplot,在各个方面之间绘制线

时间:2015-07-29 01:56:52

标签: r ggplot2

使用ggplot2,我如何绘制在facet之间运行的趋势线。

library(ggplot2)
df <- data.frame(y=c(1,2,3),x=1,Set=LETTERS[1:3])
ggplot(df,aes(x,y)) + 
  theme_bw() + theme(legend.position=c(0,1),legend.justification=c(0,1)) + 
  geom_point(aes(fill=Set),color="black",shape=21,size=3) + 
  facet_grid(~Set) + 
  xlim(1,5)

产生以下内容:

Output

在上面,我想在这三点之间画一条线,横过小平面。

1 个答案:

答案 0 :(得分:17)

已更新为ggplot2 V3.0.0

你可以这样做,但是关闭剪辑可能会产生不良后果,

(function () {
    
    var emailAddressIsValid = function (email) {
    var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    return re.test(email);
};

var passwordsMatch = function (password, passwordConfirm) {
    return password === passwordConfirm;
};

var passwordIsComplex = function (password) {
    // TODO: implement password complexity rules here.  There should be similar rule on the server side.
    return true;
};

  $(document).delegate("#page-signup", "pagebeforecreate", function () {        

        var $signUpPage = $("#page-signup"),
            $btnSubmit = $("#btn-submit", $signUpPage);

        $btnSubmit.off("tap").on("tap", function () {
            
            var $ctnErr = $("#ctn-err", $signUpPage),
                $txtFirstName = $("#txt-first-name", $signUpPage),
                $txtLastName = $("#txt-last-name", $signUpPage),
                $txtEmailAddress = $("#txt-email-address", $signUpPage),
                $txtPassword = $("#txt-password", $signUpPage),
                $txtPasswordConfirm = $("#txt-password-confirm", $signUpPage);

            var firstName = $txtFirstName.val().trim(),
                lastName = $txtLastName.val().trim(),
                emailAddress = $txtEmailAddress.val().trim(),
                password = $txtPassword.val().trim(),
                passwordConfirm = $txtPasswordConfirm.val().trim(),
                invalidInput = false,
                invisibleStyle = "bi-invisible",
                invalidInputStyle = "bi-invalid-input";

            // Reset styles.
            $ctnErr.removeClass().addClass(invisibleStyle);
            $txtFirstName.removeClass(invalidInputStyle);
            $txtLastName.removeClass(invalidInputStyle);
            $txtEmailAddress.removeClass(invalidInputStyle);
            $txtPassword.removeClass(invalidInputStyle);
            $txtPasswordConfirm.removeClass(invalidInputStyle);

            // Flag each invalid field.
            if (firstName.length === 0) {
                $txtFirstName.addClass(invalidInputStyle);
                invalidInput = true;
            }
            if (lastName.length === 0) {
                $txtLastName.addClass(invalidInputStyle);
                invalidInput = true;
            }
            if (emailAddress.length === 0) {
                $txtEmailAddress.addClass(invalidInputStyle);
                invalidInput = true;
            }
            if (password.length === 0) {
                $txtPassword.addClass(invalidInputStyle);
                invalidInput = true;
            }
            if (passwordConfirm.length === 0) {
                $txtPasswordConfirm.addClass(invalidInputStyle);
                invalidInput = true;
            }

            // Make sure that all the required fields have values.
            if (invalidInput) {
                $ctnErr.html("<p>Please enter all the required fields.</p>");
                $ctnErr.addClass("bi-ctn-err").slideDown();
                return;
            }

            if (!emailAddressIsValid(emailAddress)) {
                $ctnErr.html("<p>Please enter a valid email address.</p>");
                $ctnErr.addClass("bi-ctn-err").slideDown();
                $txtEmailAddress.addClass(invalidInputStyle);
                return;
            }

            if (!passwordsMatch(password, passwordConfirm)) {
                $ctnErr.html("<p>Your passwords don't match.</p>");
                $ctnErr.addClass("bi-ctn-err").slideDown();
                $txtPassword.addClass(invalidInputStyle);
                $txtPasswordConfirm.addClass(invalidInputStyle);
                return;
            }

            if (!passwordIsComplex(password)) {
                // TODO: Use error message to explain password rules.
                $ctnErr.html("<p>Your password is very easy to guess.  Please try a more complex password.</p>");
                $ctnErr.addClass("bi-ctn-err").slideDown();
                $txtPassword.addClass(invalidInputStyle);
                $txtPasswordConfirm.addClass(invalidInputStyle);
                return;
            }

            $.ajax({
                type: 'POST',
                url: FBT.Settings.signUpUrl,
                data:"email=" + emailAddress + "&firstName=" + firstName + "&lastName=" + lastName + "&password=" + password + "&passwordConfirm=" + passwordConfirm,
                success: function (resp) {
                    console.log("success");
                    if (resp.success === true) {
                        $.mobile.navigate("signup-succeeded.html");
                        return;
                    }
                    if (resp.extras.msg) {
                        switch (resp.extras.msg) {
                            case FBT.ApiMessages.DB_ERROR:
                            case FBT.ApiMessages.COULD_NOT_CREATE_USER:
                                // TODO: Use a friendlier error message below.
                                $ctnErr.html("<p>Oops! A problem occured while trying to register you.  Please try again in a few minutes.</p>");
                                $ctnErr.addClass("bi-ctn-err").slideDown();
                                break;
                            case FBT.ApiMessages.EMAIL_ALREADY_EXISTS:
                                $ctnErr.html("<p>The email address that you provided is already registered.</p>");
                                $ctnErr.addClass("bi-ctn-err").slideDown();
                                $txtEmailAddress.addClass(invalidInputStyle);
                                break;
                        }
                    }
                    
                },
                error: function (e) {
                    console.log(e.message);
                    // TODO: Use a friendlier error message below.
                    $ctnErr.html("<p>Oops! A problem occured while trying to register you.  Please try again in a few minutes.</p>");
                    $ctnErr.addClass("bi-ctn-err").slideDown();
                }
            });
        });
    });
})();

enter image description here