Skip to content

R-CoderDotCom/econocharts

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

61 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

Packages

No packages published

Contributors 3

  •  
  •  
  •  

Languages