python - 如何用另一列中的值注释条形图
问题描述
我正在使用双条图来比较每条轨道的总覆盖范围。由于一组的总覆盖面明显大于第二组,我决定创建另一列,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")
解决方案
您可以取高度的反对数来取回原始数字。假设使用自然对数,则倒数为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')
.
推荐阅读
- r - 为什么我的 ccdf 图从 0.4 而不是 1 开始?
- s4sdk - 无法获取元数据:无法执行 OData 元数据请求。将 s4sdk 部署到 Cloud Foundry 后出错
- java - 如何显示来自 ArrayList 的图像
(SQLite) - c++ - 具有 0..n 参数的跨平台可变参数宏
- html - 在“p”标签内带有“href”属性的“a”标签
- c# - C# 在异步 void 完成后打开一个 void
- amazon-web-services - 参数 cidrBlock 的值 (PrivateSubnet2CIDR) 无效。这不是有效的 CIDR 块。这是我得到的错误
- python - 将除 (1,1,1) 和 (0,0,0) 之外的 BGR 通道转换为白色 (255,255,255)
- python - 在 Spark 中的 EMR 上使用 --py-files 从 .zip 文件(使用 zipfile 包在 python 中创建)导入模块时出现问题
- node.js - 对 node.js 模块使用单例方法