Individual observations can reveal patterns that are easy to miss when data is summarized. A dot plot keeps those observations visible, placing each one as a dot along a numerical scale and stacking dots when the same value appears more than once. This makes repeated values, gaps, clusters, and unusually high or low observations easy to spot.
The name can refer to two different charts. A traditional dot plot shows individual observations, while a Cleveland dot plot uses dots to compare values across categories. We’ll cover both, starting with the traditional version.
What is a dot plot?
Traditional or Wilkinson dot plot
A traditional dot plot places one dot for every observation along a numerical scale. If several observations have the same value, those dots stack at the same position.
This illustrative example contains 32 customer support requests. Each dot represents one request, and its position shows how many minutes the customer waited for a first response. Stacked dots represent customers who waited the same number of minutes.
The repeated waits at 8 and 12 minutes stand out, but the chart also keeps the few longer waits visible. Customers therefore had different experiences that a single average would conceal: some shared a common waiting time, while others waited considerably longer.
In many US classrooms, this traditional form is also called a line plot. That is different from a line graph, where points are connected to show change over an ordered variable such as time.
Cleveland dot plot
A Cleveland dot plot has a different purpose. Instead of one dot per observation, it usually has one dot per category.
The same requests (from the support dataset) are grouped into support queues, or categories of help: account access, billing, data import, and developer API questions. For each queue, we calculate the median waiting time: the middle value after sorting its waiting times, or the average of the two middle values when the count is even. Each dot now represents that summary for a whole queue.
The typical wait for developer API help is more than twice that for account access. Sorting the dots makes that difference easy to find, but the summaries no longer show how much individual waits vary within each queue. This view answers “Which category has the longer typical wait?” rather than “What did every customer experience?”
You could also compare these median waiting times with a bar graph when bars would be more familiar to your audience.
How to read a dot plot
For a traditional chart, start with the numerical axis. A marker at 8 represents one observation with a value of 8. Vertical position is only a stacking device, not a second measurement.
Then inspect:
- Frequency: Count the dots in a stack to find how often a value occurs.
- Shape: Look for concentrations, gaps, clusters, and isolated observations across the scale.
- Spread: Identify the lowest and highest values and the distance between them.
For a Cleveland chart, read the category labels first, then compare each marker's horizontal position. Check whether the categories are sorted and whether a dot represents a raw observation, mean, median, rate, or another summary.
Although both are called dot plots, their markers answer different questions.
Dot plot example: find the mean and median
For a smaller example, imagine eight customers waiting for a first response from support. Their waiting times, sorted from shortest to longest, are:
2, 2, 3, 4, 4, 4, 5, 8 minutes
How to find the mean of a dot plot
Count every dot, including dots stacked at the same value. The eight response times add up to 32 minutes, so the mean is:
32 ÷ 8 = 4 minutes
Do not average only the distinct labels on the axis. Calculating (2 + 3 + 4 + 5 + 8) ÷ 5 would ignore the repeated observations at 2 and 4 and produce the wrong answer.
How to find the median of a dot plot
Read the observations from lowest to highest. With eight values, the median is the average of the fourth and fifth observations. Both are 4, so the median is 4 minutes.
The most frequent value, called the mode, is also 4 minutes. The range, or the difference between the longest and shortest waits, is 8 − 2 = 6 minutes.
Although the mean and median are both 4 minutes, not every customer waited about that long. One waited 8 minutes, separated from the others by a gap at 6 and 7. Keeping that dot visible shows a longer wait that neither summary conveys on its own.
You can recreate this chart from these values and check that every waiting time appears once, including repeated values.
When to use a dot plot
Use the traditional form when retaining every observation makes the distribution easier to understand. It is particularly useful for small datasets with repeated values or meaningful gaps.
There is no universal sample-size cutoff. Readability depends on the number of observations, the number of distinct values, the required precision, and the available space. If the stacks become crowded, a histogram or another summary may communicate the pattern more clearly.
Use a Cleveland plot when you want to compare one summary value across categories. It works well for rankings, survey results, team metrics, and other cases where a full set of bars would feel visually heavy.
Dot plot vs. histogram, bar graph, and scatter plot
These charts can look related, but they answer different questions.
| Chart | What it shows | Use it when |
|---|---|---|
| Traditional dot plot | Individual values of one numerical variable | Every observation should remain visible |
| Histogram | Counts within numerical intervals | Many observations are easier to group into bins |
| Cleveland dot plot | A numerical value for each category | You want a compact category comparison |
| Bar graph | A numerical value for each category | Bar length makes the comparison easiest to read |
| Scatter plot | Two numerical measurements for each observation | You want to examine a relationship between variables |
A traditional dot plot and a histogram can show the same underlying variable. In our first chart, five 8-minute observations remain five separate dots. If we group those waiting times into histogram bins, each bar shows the number of observations within an interval. That grouping helps when individual dots become too crowded to read, but hides their exact values.
A Cleveland plot is closer to a category chart. You could compare the same queue medians with bars; the choice depends on which presentation is clearer for the audience.
Scatter plots are different again. A traditional dot plot only encodes one numerical measurement. If each support ticket also had a satisfaction score and you wanted to examine whether longer waits were associated with lower scores, you would switch to a scatter plot.
Dot plot examples with real data
The support-wait charts above use small, made-up datasets so it is easy to see how each type of dot plot works. The next two examples use public data: one for the traditional stacked form and one for the Cleveland form.
Service-request resolution times
New York City’s 311 service records requests for help with nonemergency city issues. NYC Open Data includes timestamps showing when each request was created and closed.
This example uses 40 requests created on January 15 and 16, 2025, that closed within 48 hours. They were taken in request-ID order, so they are an illustrative sample rather than a random sample of the city’s requests. Each dot shows the elapsed time between creation and closure, rounded to the nearest hour.
Most requests in this sample closed within a few hours: 34 of the 40 round to five hours or less. The dots keep the few longer times visible alongside the common shorter ones. Because the sample is not random and excludes requests that took more than 48 hours, it does not show the full range of resolution times across the city's 311 service.
The stacks represent rounded hours, so requests at the same position did not necessarily take exactly the same time. A dot at zero means the elapsed time rounded to zero hours, not that the request was closed instantly.
Developer compensation by role
The 2025 Stack Overflow Developer Survey records respondents’ roles and annual compensation, converted to US dollars. This example compares median compensation across four roles using responses with a stated role and a compensation amount greater than zero.
Each dot represents a role’s median, not an individual person’s compensation. Respondents could select several roles, so one person may contribute to more than one category.
The two management and executive roles have substantially higher medians than the two developer roles, while the difference within each pair is smaller. The dot positions make those gaps easy to compare. They do not show how widely compensation varies within each role, which would require a view such as a box plot.
How to make a dot plot in Deepnote
Start by choosing which form answers your question.
For a traditional stacked chart, prepare one numerical value per observation. Repeated values should remain as separate rows because each row becomes one marker. For a Cleveland chart, prepare one category and the numerical summary you want to compare, such as a median, rate, or percentage.
You can use Deepnote’s dot plot maker with uploaded or pasted data. For example:
Create a stacked dot plot of these customer support waiting times in minutes: 2, 2, 3, 4, 4, 4, 5, 8. Show one dot per observation and stack repeated values. Label the numerical axis ‘Minutes to first response’ and verify that the chart contains eight dots.
The workflow can also begin outside the Deepnote interface. With the Deepnote plugin in ChatGPT or the Codex data analytics plugin, an agent can inspect the connected workspace, create or update a notebook, run it, and return the result within the user’s existing permissions. For example, you could ask it to pull the NYC 311 sample into a new notebook and plot the resolution times as stacked dots.
Inside Deepnote, Deepnote Agent can inspect the surrounding project, add or revise Python and text blocks, execute the code, and check its outputs. With the eight-value example loaded in the notebook, you could ask:
Verify that the chart contains eight dots, including three at 4 minutes. Calculate the mean, median, mode, and range from the plotted observations, and explain each result beside the chart.
The source values, stacking logic, calculations, and output remain in the shared notebook, where another person can inspect or extend them. This reflects the idea in our notebook manifesto: the notebook can hold both the analytical work and the record of how the result was produced. Run snapshots also preserve the executed blocks, outputs, and execution metadata from each completed run.
If you have not selected a format, the AI chart generator can help you explore an appropriate chart from your data.