如何用Matplotlib/Seaborn复现YouGov的美英动物格斗信心差值图?
复现YouGov差值条形图的Matplotlib/Seaborn实现方案
要复现这款展示美英受访者信心差值的横向条形图,用Matplotlib或Seaborn都能轻松实现,下面是具体的代码示例和关键细节说明:
1. 准备数据
首先需要构造(或导入)包含动物名称、美英信心差值的数据集。这里用模拟数据示例(差值定义为美国受访者信心值 - 英国受访者信心值):
import pandas as pd # 模拟差值数据,匹配原图表趋势 data = { 'Animal': ['黑猩猩', '熊', '狼', '山狮', '鳄鱼', '鹰', '大白鲨', '大象', '老虎', '狮子'], 'Diff': [12, 10, 8, 5, 3, -2, -5, -7, -10, -15] } df = pd.DataFrame(data) # 按差值降序排序,让图表逻辑更清晰 df = df.sort_values('Diff', ascending=False)
2. Matplotlib实现
import matplotlib.pyplot as plt # 设置画布大小 plt.figure(figsize=(8, 6)) # 根据差值正负分配条形颜色(正差蓝色,负差红色,匹配原图表风格) bar_colors = ['#1a75ff' if diff > 0 else '#ff4c4c' for diff in df['Diff']] bars = plt.barh(df['Animal'], df['Diff'], color=bar_colors) # 添加中间的0基准线,区分正负差值 plt.axvline(x=0, color='gray', linestyle='--', alpha=0.7) # 给每个条形标注具体差值 for bar in bars: bar_width = bar.get_width() # 根据正负调整标签位置,避免和条形重叠 label_x = bar_width + 1 if bar_width > 0 else bar_width - 1 plt.text(label_x, bar.get_y() + bar.get_height()/2, f'{bar_width:+d}', va='center', fontsize=10) # 设置图表标题和坐标轴标签 plt.title('美英受访者对打赢动物信心的平均差值(美国-英国)', fontsize=12) plt.xlabel('信心差值', fontsize=10) plt.ylabel('动物', fontsize=10) # 自动调整布局,防止文字被截断 plt.tight_layout() plt.show()
3. Seaborn实现
Seaborn可以更简洁地处理颜色映射,代码如下:
import seaborn as sns plt.figure(figsize=(8, 6)) # 绘制横向条形图,用hue区分正负差值并分配颜色 sns.barplot(data=df, x='Diff', y='Animal', hue=df['Diff'] > 0, palette={True: '#1a75ff', False: '#ff4c4c'}, legend=False) # 添加0基准线 plt.axvline(x=0, color='gray', linestyle='--', alpha=0.7) # 标注差值数值 for idx, row in df.iterrows(): label_x = row['Diff'] + 1 if row['Diff'] > 0 else row['Diff'] - 1 plt.text(label_x, idx, f'{row["Diff"]:+d}', va='center', fontsize=10) # 设置图表元素 plt.title('美英受访者对打赢动物信心的平均差值(美国-英国)', fontsize=12) plt.xlabel('信心差值', fontsize=10) plt.ylabel('动物', fontsize=10) plt.tight_layout() plt.show()
关键细节说明
- 颜色选择:匹配原图表的蓝红配色,正差值用蓝色,负差值用红色,增强可读性
- 数值标注:根据差值正负调整标签位置,避免和条形重叠
- 排序处理:将差值从大到小排序,让图表趋势更直观
- 基准线:添加灰色虚线作为0基准,清晰区分美英两国的信心差异
内容的提问来源于stack exchange,提问作者Aaron Elliot
相关产品推荐
相关产品推荐

