Response: Scenario a: We have two variables – both continuous. Let’s say continuous variable a and continuous variable b. We can consider mpg dataset and leverage various functions to analyze data distribution. i) geom_label() - geom_label() draws a rectangle behind the text, making it easier to read. Example of a plot is shown below. a <- ggplot(mpg, aes(cty,hwy)) a+geom_label(aes(label=cty),nudge_x = 1,nudge_y = 1) i) geom_jitter() - The jitter geom is a convenient shortcut for geom_point(position = "jitter"). It adds a small amount of random variation to the location of each point, and is a useful way of handling overplotting caused in smaller datasets.   a <- ggplot(mpg, aes(cty,hwy)) a+geom_jitter(height = 2,width = 2) Other usages could be – geom_quantile(), geom_smooth() etc. Scenario b: We have two variables – one discrete and other continuous. We can consider mpg dataset and leverage various functions to analyze data distribution. i) Geom_col() - There are two types of bar charts: geom_bar() and geom_col(). If you want the heights of the bars to represent values in the data, use geom_col(). geom_col() uses stat_identity(): it leaves the data as-is. Here when we take “class” and “hwy” parameters in the mpg dataset, we can plot something like below.   b <- ggplot(mpg,aes(class,hwy)) b+geom_col() i) Geom_boxplot() - The boxplot compactly displays the distribution of a variable. It visualises five summary statistics (the median, two hinges and two whiskers), and all "outlying" points individually. b <- ggplot(mpg,aes(class,hwy)) b+geom_boxplot() Other usages could be – geom_dotplot(), geom_violin() etc.