条形图和计数图在同一图中

时间:2019-12-19 17:57:54

标签: python matplotlib count bar-chart

我想在同一图中绘制一个条形图并计数图。但是,当我用两个不同的y轴绘制它们时,两个图相互重叠(参见图片)。是否可以选择将其中一个地块“移”到一边?

fig, ax1 = plt.subplots(figsize=(15, 10))
ax2 = ax1.twinx()

ax1.bar(x=damage_sum[Kanton], height=damage_sum[sTot], color=colors)
ax2 = sns.countplot(x=dff[Kanton], data=dff, palette=colors, order=cantons) 

数据描述

damage_sum[Kanton] = ['ZG', 'VD', 'SO', 'SG', 'NW', 'NE', 'LU', 
                      'JU', 'GR', 'GL', 'FR', 'BL', 'AG']

enter image description here

1 个答案:

答案 0 :(得分:0)

虽然有些混乱,但是手动更改条的宽度和位置可以完成工作。
我使用了seaborn的条形图,绘制数据框更容易

$ unzip -l Word.docx
Archive:  Word.docx
  Length      Date    Time    Name
---------  ---------- -----   ----
     1364  1980-01-01 00:00   [Content_Types].xml
      734  1980-01-01 00:00   _rels/.rels
      817  1980-01-01 00:00   word/_rels/document.xml.rels
     1823  1980-01-01 00:00   word/document.xml
     6799  1980-01-01 00:00   word/theme/theme1.xml
     2068  1980-01-01 00:00   docProps/thumbnail.emf
     2652  1980-01-01 00:00   word/settings.xml
     1954  1980-01-01 00:00   word/fontTable.xml
      576  1980-01-01 00:00   word/webSettings.xml
      735  1980-01-01 00:00   docProps/core.xml
    28979  1980-01-01 00:00   word/styles.xml
      709  1980-01-01 00:00   docProps/app.xml
---------                     -------
    49210                     12 files

enter image description here barplot的条形图和countplot的条形图在高度上的变化很大,因此我想说归一化值,countplot不支持Estimator,因此请使用barplot的estimator来找到相对值

import seaborn as sns;sns.set()
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

def change_width(ax, new_value,recenter=False) :
    for patch in ax.patches :
        current_width = patch.get_width()
        diff = current_width - new_value
        patch.set_width(new_value)
        if recenter==True:  
            patch.set_x(patch.get_x() + diff * .5) #To recenter the bars

df = sns.load_dataset('tips')
fig, ax1 = plt.subplots(figsize=(8, 8))
ax2 = ax1.twinx()

ax1 = sns.countplot(x='day', data=df)
change_width(ax1, 0.35)

ax2 = sns.barplot(x="day", y="total_bill", data=df,palette='viridis')
change_width(ax1, 0.35,True)

change_width函数