📖 Scenario: You are working as a data analyst for a company that wants to visualize customer satisfaction survey results. The survey asked customers to rate their satisfaction on a scale from -5 (very dissatisfied) to +5 (very satisfied). You want to create a diverging bar chart to clearly show positive and negative feedback.
🎯 Goal: Build a diverging bar chart using matplotlib that displays customer satisfaction scores for different product features. Positive scores should extend to the right, negative scores to the left, with bars colored differently based on satisfaction.
📋 What You'll Learn
Create a dictionary called features with exact keys and integer values for satisfaction scores.
Create a list called colors that assigns 'green' for positive scores and 'red' for negative scores.
Use a for loop with variables feature and score to plot horizontal bars with correct colors and positions.
Print the matplotlib figure with the diverging bar chart showing feature names on the y-axis.
💡 Why This Matters
🌍 Real World
Diverging bar charts are useful to show positive and negative feedback clearly, such as customer satisfaction, survey results, or sentiment analysis.
💼 Career
Data analysts and scientists often use diverging bar charts to communicate insights from data that has both positive and negative values, making it easier for stakeholders to understand.
Progress0 / 4 steps
1
Create the data dictionary
Create a dictionary called features with these exact entries: 'Ease of Use': 4, 'Performance': -3, 'Design': 5, 'Support': -2, 'Price': -4.
Matplotlib
Hint
Use curly braces {} to create the dictionary with the exact keys and values.
2
Create the colors list
Create a list called colors that contains 'green' for each positive score and 'red' for each negative score in features.values(). Use a list comprehension with score as the variable.
Matplotlib
Hint
Use a list comprehension with an if condition inside square brackets.
3
Plot the diverging bar chart
Import matplotlib.pyplot as plt. Use plt.barh() inside a for loop with variables feature, score, and color to plot horizontal bars. Use enumerate(features.items()) to get the index i. Set the bar length to score, the y-position to i, and the bar color to color. Set align='center'.
Matplotlib
Hint
Use enumerate and zip together to loop over features and colors with index.
4
Display the chart with labels
Set the y-axis ticks to the range of feature count using plt.yticks() with positions as range(len(features)) and labels as list(features.keys()). Add a vertical line at x=0 using plt.axvline(0, color='black'). Finally, call plt.show() to display the diverging bar chart.
Matplotlib
Hint
Use plt.yticks() to label bars and plt.axvline() to draw the center line.
Practice
(1/5)
1. What is the main purpose of a diverging bar chart in data visualization?
easy
A. To visualize hierarchical data using nested bars
B. To show positive and negative values side by side for easy comparison
C. To plot time series data with a line connecting points
D. To display only positive values in a stacked format
Solution
Step 1: Understand the chart type
Diverging bar charts are designed to display data that has both positive and negative values.
Step 2: Identify the purpose
They place positive and negative bars side by side to highlight differences clearly.
Final Answer:
To show positive and negative values side by side for easy comparison -> Option B
Quick Check:
Diverging bar chart = positive & negative side by side [OK]
Hint: Look for charts showing positive and negative bars side by side [OK]
Common Mistakes:
Confusing diverging bar charts with stacked bar charts
Thinking they only show positive values
Mixing up with line charts
2. Which of the following is the correct way to create a diverging bar chart using matplotlib's barh function for negative and positive values?
easy
A. plt.barh(y_pos, abs(values), color='red')
B. plt.barh(y_pos, values, color='blue')
C. plt.barh(y_pos, values, color=['red' if v < 0 else 'green' for v in values])
D. plt.barh(y_pos, values, color=['green' if v > 0 else 'blue' for v in values])
Solution
Step 1: Understand color assignment for diverging bars
Colors should differ based on whether values are positive or negative to highlight divergence.
Step 2: Check the color list comprehension
plt.barh(y_pos, values, color=['red' if v < 0 else 'green' for v in values]) uses a list comprehension assigning 'red' for negative and 'green' for positive values, which is correct.
Final Answer:
plt.barh(y_pos, values, color=['red' if v < 0 else 'green' for v in values]) -> Option C
Quick Check:
Color by sign = plt.barh(y_pos, values, color=['red' if v < 0 else 'green' for v in values]) [OK]
Hint: Use list comprehension to color bars by sign [OK]
Common Mistakes:
Using a single color for all bars
Taking absolute values which lose sign info
Assigning wrong colors to positive/negative values
3. Given the code below, what will be the color of the bar corresponding to the value -3?
import matplotlib.pyplot as plt
values = [4, -3, 2, -1]
y_pos = range(len(values))
colors = ['green' if v > 0 else 'red' for v in values]
plt.barh(y_pos, values, color=colors)
plt.show()
medium
A. No color (default)
B. Green
C. Blue
D. Red
Solution
Step 1: Analyze the color assignment logic
The list comprehension assigns 'green' if value > 0, else 'red'.
Step 2: Check the value -3
-3 is less than 0, so it gets 'red'.
Final Answer:
Red -> Option D
Quick Check:
Negative value color = red [OK]
Hint: Negative values get 'red' color here [OK]
Common Mistakes:
Assuming negative values get green
Confusing color assignment logic
Ignoring the else condition in list comprehension
4. The following code is intended to create a diverging bar chart but does not color bars correctly. What is the error?
values = [5, -2, 3, -4]
y_pos = range(len(values))
colors = ['green' if v < 0 else 'red' for v in values]
plt.barh(y_pos, values, color=colors)
plt.show()
medium
A. The color condition is reversed; positive values should be green
B. The y_pos variable should be a list, not a range
C. The barh function cannot accept a color list
D. Values should be absolute for coloring
Solution
Step 1: Review the color condition
The code assigns 'green' if value < 0, else 'red'. This means negative values are green and positive are red.
Step 2: Understand diverging bar chart color convention
Usually, positive values are green and negative values are red to show gains and losses clearly.
Final Answer:
The color condition is reversed; positive values should be green -> Option A
Quick Check:
Positive = green, negative = red [OK]
Hint: Positive bars usually green, negative bars red [OK]
Common Mistakes:
Reversing color conditions
Thinking range is invalid for y_pos
Using absolute values for coloring
5. You have a dataset with sales gains and losses for 5 products: {'A': 10, 'B': -5, 'C': 0, 'D': 7, 'E': -3}. How would you create a diverging bar chart that clearly shows gains in green, losses in red, and zero values in gray using matplotlib?
hard
A. Use a color list with a condition: green if >0, red if <0, gray if 0, then plot with plt.barh
B. Plot absolute values only with a single color to avoid confusion
C. Use plt.barh with colors assigned randomly
D. Plot only positive values and ignore zeros and negatives
Solution
Step 1: Define color conditions for all cases
Assign 'green' for positive, 'red' for negative, and 'gray' for zero values to distinguish all clearly.
Step 2: Create color list and plot
Use a list comprehension to assign colors based on value sign, then plot with plt.barh using these colors.
Final Answer:
Use a color list with a condition: green if >0, red if <0, gray if 0, then plot with plt.barh -> Option A
Quick Check:
Color by sign including zero = Use a color list with a condition: green if >0, red if <0, gray if 0, then plot with plt.barh [OK]
Hint: Add gray for zero values in color list [OK]
Common Mistakes:
Ignoring zero values color
Using absolute values losing sign info
Assigning random colors without logic
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.