Penelope Wilhern (Christina Ricci) is a young woman from a wealthy family with all the qualities to make an excellent match for any other well-bred man of her status. What sets her apart is that she has pig-face disorder.
Generations ago, an embittered witch placed a curse on the Wilhern family after their son had an affair with her daughter, one of the Wilhern servants, and, talked out of marrying her by his disapproving family, abandoned her and married someone of his own status. The distraught and pregnant servant girl then threw herself off of a cliff. Furious, the witch then cursed the Wilherns so that the next daughter to be born into the affluent family would have the face of a pig. For five generations, the Wilherns produced only sons, until Penelope was born, stricken with the curse. It is said that the curse can only be lifted if 'one of her own' learns to love her, which her parents interpret as meaning that Penelope must marry a man of noble birth.
A dwarf tabloid reporter named Lemon (Peter Dinklage) begins stalking the family to get a photograph of the infant Penelope resulting in Penelope's mother making him part blind after he breaks into their house. Then, Penelope's parents, Jessica and Franklin (Catherine O'Hara and Richard E. Grant), decide to fake their daughter's death and cloister her away in their mansion, where Penelope spends her life immersing herself in intellectual pursuits such as literature, horticulture, and music. When Penelope becomes an adult, her parents attempt to introduce her to possible suitors, hoping that one of them will fall in love with her and break the curse, with the help of Wanda, a matchmaker. Unfortunately, every man who lays eyes on her flees in terror, including Edward Humphrey Vanderman III (Simon Woods), a spoiled, cruel-hearted snob who finds her repulsive. Normally, Jake, their majordomo, catches them before they leave, but he fails to catch Vanderman.
Vanderman's panicked flight from the Wilhern house results in a newspaper article dubbing him insane. To redeem his name, Vanderman decides to team up with Lemon in an effort to get a photograph of Penelope. The two of them track down Max Campion (James McAvoy), a young blue blood disowned by his family, who has developed a gambling problem and is in desperate need of money. Lemon and Vanderman pay Max to pose as a new suitor for Penelope, hiding a camera in his jacket so that he can steal a picture of her. After talking to Penelope through a one-way mirror, Max is unexpectedly caught off guard by her sweetness and charm, and Penelope also trusts him enough to show him her face. Though Max is not frightened of Penelope, he accidentally triggers the camera in his jacket, which causes him to retreat. A heartbroken Penelope believes that Max too finds her monstrous, and instead begs him to marry her simply for her status and in order to break the curse. Max, though obviously torn, insists that he cannot marry Penelope. He then calls off his agreement with Lemon and Vanderman, and destroys the camera, realizing that their attempt to exploit Penelope is wrong.
Meanwhile, Penelope, inspired by Max's conversations about the outside world, decides to flee the protection of her parents' home, and journeys out into the city, naive and ignorant about normal life, and with a scarf to cover her face. While at a bar, Penelope ends up befriending a biker chick named Annie (Reese Witherspoon) who becomes her "real world" mentor. Having no money and seeing that Lemon and Vanderman are offering a reward for a photograph of her, she decides to collect on the reward by producing a photo of herself, essentially coming out of hiding to the public. To her surprise, Penelope becomes an overnight celebrity, flocked by adoring fans who are not disgusted by her face. Penelope's courage in going out to the world then acts as an inspiration for Max, who quits gambling and starts work in an old theatre. Lemon discovers that the man he and Vanderman had recruited to go in to the Wilhern house and photograph Penelope is in fact not Max Campion at all, but a man named Johnny Martin, who simply posed as Campion for the money. Penelope's family wonder whether the only reason "Max" refused to marry Penelope was because he knew that, as a non blue blood, he would not be able to break the curse for her.
Meanwhile, Vanderman's father (Nigel Havers), seeing the public's fondness for Penelope, and embarrassed by his son's vocal cruelty toward her, coerces Edward into proposing to the girl. Penelope nearly marries him, but backs out of the wedding at the last minute when she realises that she does not want to marry simply to break the curse. Though Penelope's mother urges her to marry Vanderman and at last lead a 'normal life', an exasperated Penelope says that she likes herself the way she is. This breaks the curse, as Penelope has at last been loved by 'one of her own kind' - herself - and her pig snout and ears disappear and Jake reveals itself to be the witch that cursed the family long ago.
As the months pass, Penelope moves on with her life, becoming a horticulturist and teacher, and the spectacle of her former appearance is gradually forgotten by the public. That Halloween, Penelope finds several of her students dressing up as her old pig self, and dons a 'Penelope' mask as she goes to reunite with Johnny, who she discovers lives nearby. Johnny, not knowing that the curse has been broken, kisses Penelope and apologizes to her, saying that he does not have the power to break the curse. Penelope then reveals that she had the power to lift the curse all along, and the two share a passionate kiss, beginning a romantic relationship.
Later Johnny is happily pushing Penelope on a swing in a garden. On a nearby lake, Lemon rows up in a rowboat, and is about to take a picture revealing to the world what has happened to Penelope, but observes their happiness, and decides to let his obsession go.