Penelope (Christina Ricci) heeft het niet getroffen. Ze is geboren in een familie waar een oude vloek op rust. De eerste dochter die in deze familie geboren wordt, zo riep een oude heks ooit uit, zal het gezicht van een varken hebben. Het meisje zal pas een normale neus krijgen als ze ondanks haar uiterlijk geaccepteerd en geliefd wordt. Opereren lukt niet, dus wordt ze thuis opgesloten. Zodra Penelope een jonge vrouw is, gaat haar moeder op zoek naar een geschikte huwelijkskandidaat. Met weinig succes, want zodra Penelope verschijnt vluchten alle rijke jongemannen in paniek het huis uit. Alleen Max (James McAvoy) blijft staan. Hij is namelijk ingehuurd om Penelope stiekem op de foto te zetten - want een foto van het varkensmeisje wil de krant wel! Penelope vindt Max steeds aardiger, tot ze erachter komt waarom hij bleef. Zwaar teleurgesteld besluit ze van huis weg te lopen en de wereld in te gaan, op zoek naar aardige mensen en echte vrienden. Al snel sluit ze vriendschap met Annie (Reese Witherspoon), die haar laat zien dat niet iedereen alleen naar haar uiterlijk kijkt.