首页 > 解决方案 > 如何用另一列中的值注释条形图

问题描述

我正在使用双条图来比较每条轨道的总覆盖范围。由于一组的总覆盖面明显大于第二组,我决定创建另一列,total reach - log(x)即原始的 np.log total reach。y 轴反映了日志的比例,但我想用来自total reach.

关于如何做到这一点的任何想法?

import seaborn as sns
import matplotlib.pyplot as plt

#plot a bar graph and assign track name variable to hue
double_plot = sns.barplot(
    x='date',
    y='total reach - log(x)',
    hue='track name',
    data=dflog,
    palette=['blue','red'],
    alpha=1,
    dodge=True,
)
double_plot.set_ylim(0,dflog['total reach - log(x)'].max())

for item in double_plot.get_xticklabels():
    item.set_rotation(45)
    

for p in double_plot.patches:
    double_plot.annotate(format(p.get_height(), '.0f'), 
                   (p.get_x() + p.get_width() / 2., p.get_height()), 
                   ha = 'center', va = 'center', 
                   xytext = (0, 9), 
                   textcoords = 'offset points')
fig = plt.gcf()
fig.set_size_inches(15,7)
plt.title("Total Followers - log(x) - Fleetwood Mac's Dreams")

在此处输入图像描述

标签: pythonpandasmatplotlibseaborn

解决方案


您可以取高度的反对数来取回原始数字。假设使用自然对数,则倒数为exp。(或者base ** height当对数使用另一个底时。)

就个人而言,我更喜欢将返回值命名为sns.barplot'ax' 以强调它是一个 matplotlib 的 ax 对象,可以使用标准的 matplotlib 函数。

import matplotlib.pyplot as plt
from matplotlib import dates as mdates
import seaborn as sns
import pandas as pd
import numpy as np

dflog = pd.DataFrame()
dflog['date'] = pd.to_datetime(np.repeat(pd.date_range('20200901', freq='D', periods=20), 2))
dflog['total reach - log(x)'] = np.random.uniform(0, 17, 40)
dflog['track name'] = np.tile(['Track 1', 'Track 2'], 20)

ax = sns.barplot(
    x='date',
    y='total reach - log(x)',
    hue='track name',
    data=dflog,
    palette=['blue', 'red'],
    alpha=1,
    dodge=True)
ax.set_ylim(0, dflog['total reach - log(x)'].max() * 1.15)

for item in ax.get_xticklabels():
    item.set_rotation(45)

for p in ax.patches:
    ax.annotate(format(np.exp(p.get_height()), '.0f'),
                (p.get_x() + p.get_width() / 2., p.get_height()),
                ha='center', va='center',
                xytext=(0, 9),
                textcoords='offset points')
ax.xaxis.set_major_formatter(mdates.DateFormatter('%y-%m-%d'))
fig = plt.gcf()
fig.set_size_inches(15, 7)
ax.set_title("Testing")
plt.tight_layout()
plt.show()

示例图

另一种方法可能是在任何地方使用原始值(不带对数),并将对数刻度设置为 y 轴:ax.set_yscale('log').


推荐阅读