Code Monkey home page Code Monkey logo

econocharts's Introduction

econocharts package

Microeconomics/macroeconomics graphs made with ggplot2

This package allows creating microeconomics or macroeconomics charts in R with simple functions. This package inspiration is reconPlots by Andrew Heiss.

THE PACKAGE IS UNDER HEAVY DEVELOPMENT. WORK IN PROGRESS. You can suggest ideas by submitting an Issue or contributing submitting Pull Requests.

TODO

  • Finish documentation
  • Price control (in sdcurve function)
  • Allow drawing custom functions
  • Add graph for budget constraints
  • Fix linecol argument
  • Tax graph
  • Shade producer and consumer surplus
  • Add Edgeworth box
  • General equilibrium (suggested by Ilya)
  • Prospect theory value function (suggested by @brshallo)
  • Neoclassical labor supply (suggested by @hilton1)

Index

Installation

GitHub

# Install the development version from GitHub:
# install.packages("devtools")
devtools::install_github("R-CoderDotCom/econocharts")

CRAN

The package will be on CRAN as soon as possible

Supply

supply() # Default plot

supply(ncurves = 1,          # Number of supply curves to be plotted
      type = "line",         # Type of the curve
      x = c(2, 4, 5),        # Y-axis values where to create intersections
      linecol = 2,           # Color of the curves
      geom = "label",        # Label type of the intersection points
      geomfill = "pink",     # If geom = "label", is the background color of the label
      main = "Supply curve") # Title of the plot

supply(ncurves = 3, # Three supply curves
       xlab = "X",  # X-axis label
       ylab = "Y",  # Y-axis label
       bg.col = "lightblue") # Background color

Demand

demand(x = 3:6,  # Intersections
      generic = FALSE) # Axis values with the actual numbers

demand(main = "Demand", # Title
       sub = "curve",   # Subtitle
       xlab = "X",      # X-axis label
       ylab = "Y",      # Y-axis label
       names = "D[1]",  # Custom name for the curve
       geomcol = 2)     # Color of the custom name of the curve

Supply and demand

sdcurve() # Default supply and demand plot

# Custom data
supply1 <- data.frame(x = c(1, 9), y = c(1, 9))
supply1

demand1 <- data.frame(x = c(7, 2), y = c(2, 7))
demand1

supply2 <- data.frame(x = c(2, 10), y = c(1, 9))
supply2

demand2 <- data.frame(x = c(8, 2), y = c(2, 8))
demand2

p <- sdcurve(supply1,   # Custom data
             demand1,
             supply2, 
             demand2,
             equilibrium = TRUE, # Calculate the equilibrium
             bg.col = "#fff3cd") # Background color
p + annotate("segment", x = 2.5, xend = 3, y = 6.5, yend = 7,                # Add more layers
             arrow = arrow(length = unit(0.3, "lines")), colour = "grey50")

Neoclassical labor supply

neolabsup(x = c(2, 3, 5, 7), xlab = "Quantity of\n labor supplied", ylab = "Wage rate")

Indifference curves

indifference() # Default indifference curve

indifference(ncurves = 2,  # Two curves
             x = c(2, 4),  # Intersections
             main = "Indifference curves",
             xlab = "Good X",
             ylab = "Good Y",
             linecol = 2,  # Color of the curves
             pointcol = 2) # Color of the intersection points

p <- indifference(ncurves = 2, x = c(2, 4), main = "Indifference curves", xlab = "Good X", ylab = "Good Y")

int <- bind_rows(curve_intersect(data.frame(x = 1:1000, y = rep(3, nrow(p$curve))), p$curve + 1))

p$p + geom_segment(data = int, aes(x = 0, y = y, xend = x, yend = y), lty = "dotted")  +
      geom_segment(data = int, aes(x = x, y = 0, xend = x, yend = y), lty = "dotted") +
      geom_point(data = int, size = 3)

indifference(ncurves = 2,    # Two curves
             type = "pcom",  # Perfect complements
             main = "Indifference curves",
             sub = "Perfect complements",
             xlab = "Good X",
             ylab = "Good Y",
             bg.col = "#fff3cd", # Background color
             linecol = 1)  # Color of the curve

indifference(ncurves = 5,     # Five curves
             type = "psubs",  # Perfect substitutes
             main = "Indifference curves",
             sub = "Perfect substitutes",
             xlab = "Good X",
             ylab = "Good Y",
             bg.col = "#fff3cd", # Background color
             linecol = 1) # Color of the curve

Production–possibility frontier

ppf(x = 1:6, # Intersections
   main = "PPF",
   geom = "text",
   generic = TRUE, # Generic axis labels
   xlab = "X",
   ylab = "Y",
   labels = 1:6,
   acol = 3)$p

p <- ppf(x = 4:6, # Intersections
        main = "PPF",
        geom = "text",
        generic = TRUE, # Generic labels
        labels = c("A", "B", "C"), # Custom labels
        xlab = "BIKES",
        ylab = "CARS",
        acol = 3)      # Color of the area

p$p + geom_point(data = data.frame(x = 5, y = 5), size = 3) +
  geom_point(data = data.frame(x = 2, y = 2), size = 3) +
  annotate("segment", x = 3.1, xend = 4.25, y = 5, yend = 5,
           arrow = arrow(length = unit(0.5, "lines")), colour = 3, lwd = 1) +
  annotate("segment", x = 4.25, xend = 4.25, y = 5, yend = 4,
           arrow = arrow(length = unit(0.5, "lines")), colour = 3, lwd = 1)

Tax graph

Original function by Andrew Heiss.

# Data
demand <- function(Q) 20 - 0.5 * Q
supply <- function(Q) 2 + 0.25 * Q
supply_tax <- function(Q) supply(Q) + 5

# Chart
tax_graph(demand, supply, supply_tax, NULL)

# Chart with shaded areas
tax_graph(demand, supply, supply_tax, shaded = TRUE)

Prospect theory value function

ptvalue(sigma = 0.3,             
        lambda = -2.25,          
        col = 2,                  # Color of the curve
        xint = seq(0, 75, 25),    # Intersections
        xintcol = 4,              # Color of the intersection segments
        ticks = TRUE,             # Display ticks on the axes
        xlabels = TRUE,           # Display the X-axis tick labels
        ylabels = TRUE,           # Display the Y-axis tick labels
        by_x = 25, by_y = 50,     # Axis steps
        main = "Prospect Theory Value Function")

Laffer curve

laffer(ylab = "T", xlab = "t",
       acol = "lightblue", # Color of the area
       pointcol = 4)       # Color of the maximum point

laffer(xmax = 20, # Modify the curve
       t = c(3, 6, 9), # Intersections
       generic = FALSE,
       ylab = "T",
       xlab = "t",
       acol = "lightblue", # Color of the area
       alpha = 0.6,        # Transparency of the area
       pointcol = 4)       # Color of the maximum point

Intersections

The functions above can have a limited functionality if you want a fully customized plot. The curve_intersection function allows you to calculate the intersection points between two curves. You can use this function to create your custom charts.

Credits to Andrew Heiss for this function and examples.

Curved Bézier lines with empirical data

# Curves
curve1 <- data.frame(Hmisc::bezier(c(1, 8, 9), c(1, 5, 9)))
curve2 <- data.frame(Hmisc::bezier(c(1, 3, 9), c(9, 3, 1)))

# Calculate the intersections
curve_intersection <- curve_intersect(curve1, curve2)

# Create the chart
ggplot(mapping = aes(x = x, y = y)) +
  geom_line(data = curve1, color = "red", size = 1) +
  geom_line(data = curve2, color = "blue", size = 1) +
  geom_vline(xintercept = curve_intersection$x, linetype = "dotted") +
  geom_hline(yintercept = curve_intersection$y, linetype = "dotted") +
  theme_classic()

Curved lines defined with functions

Specify a X-axis range and set empirical = FALSE.

# Define curves with functions
curve1 <- function(q) (q - 10)^2
curve2 <- function(q) q^2 + 2*q + 8

# X-axis range
x_range <- 0:5

# Calculate the intersections between the two curves
curve_intersection <- curve_intersect(curve1, curve2, empirical = FALSE, 
                                      domain = c(min(x_range), max(x_range)))

# Create your custom plot
ggplot(data.frame(x = x_range)) +
  stat_function(aes(x = x), color = "blue", size = 1, fun = curve1) +
  stat_function(aes(x = x), color = "red", size = 1, fun = curve2) +
  geom_vline(xintercept = curve_intersection$x, linetype = "dotted") +
  geom_hline(yintercept = curve_intersection$y, linetype = "dotted") +
  theme_classic()

Citation

To cite packageeconochartsin publications use:

  José Carlos Soage González and Andrew Heiss (2020). econocharts: Microeconomics and Macroeconomics Charts Made with 'ggplot2'. R package version 1.0.
  https://r-coder.com/, https://r-coder.com/economics-charts-r/.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {econocharts: Microeconomics and Macroeconomics Charts Made with 'ggplot2'},
    author = {José Carlos {Soage González} and Andrew Heiss},
    year = {2020},
    note = {R package version 1.0},
    url = {https://r-coder.com/, https://r-coder.com/economics-charts-r/},
  }

Social Media

econocharts's People

Contributors

brshallo avatar r-coderdotcom avatar tvqt avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

econocharts's Issues

Passing curves to supply() and demand() causes error

I love this package and I thank you very much for it. However, I am unable to pass a data.frame to supply() and demand() to override the sample curves. When I try to do so I receive this error:

Error in `geom_line()`:
! Problem while computing aesthetics.
ℹ Error occurred in the 1st layer.
Caused by error in `FUN()`:
! object 'y' not found

Note that the same is not true for sdcurve(): passing a data.frame with x and y columns works perfectly there.

It would be awesome if you could write an example on how to achieve the desired behavior in supply() and demand().

Allow for demand taxes

Hello. Thanks for this incredible library!
Here's a suggestion: tax_graph() only allows for supply taxes. For didactic purposes, it should also allow for demand taxes, to show this:

image

Thanks!

Neoclassical labor supply

In the standard model the labor supply curve can be backward bending if the income effect dominates the substitution effect. Essentially this looks like a parabola with respect to the y axis, but determining the exact shape would depend on the particular maximization problem.

Allow subsidies in tax_graph()

Hello again. A second suggestion. tax_graph() doesn't allow supply_fun to be modified by a negative number (ie a subsidy). It'd be great if you could extend the function to incorporate subsidies!

Thanks!!

Budget constraint graph

Hello, your initiative is excellent.

It would be possible to add that a basic graph could be added that joins the budget constraint with the indifference curve.

Thanks.

Edgeworth Box?

I'm not sure if this is possible but I think it's closely related to #1 (comment).

Having Edgeworth will be nice. Thanks for the package and your efforts.

Demand curve type='line' creates supply instead.

To fix, replace at line 82 in the demand.R file with this
if(type == "line") { curve <- data.frame(x = c(xmax, 0.9), y = c(0.9, ymax)) m <- TRUE }

Thanks for your work on this project -- I really like it!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.