我希望看到如何在Seaborn中使用条形图显示数据框中的值,而不是图表中的值
1)我想在绘制另一个字段时显示数据框中一个字段的值。例如,下面,我正在绘制'tip',但我想将'total_bill'的值放在每个条形图上方(即星期五上方的325.88, 周六1778.40等等。)
2)有没有办法缩放条形的颜色,最小值'total_bill'具有最亮的颜色(在本例中为星期五),最高值'total_bill'具有最暗颜色。显然,当我进行缩放时,我会坚持使用一种颜色(即蓝色)。
谢谢!我确信这很容易,但我很想念它..
虽然我看到其他人认为这是另一个问题(或两个)的重复,但我错过了我如何使用图中没有的值作为标签的基础或者阴影。怎么说,用total_bill作为基础。对不起,但我根据这些答案无法弄明白。
从以下代码开始,
import pandas as pd
import seaborn as sns
%matplotlib inline
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata- book/master/ch08/tips.csv", sep=',')
groupedvalues=df.groupby('day').sum().reset_index()
g=sns.barplot(x='day',y='tip',data=groupedvalues)
我得到以下结果:
临时解决方案:
for index, row in groupedvalues.iterrows():
g.text(row.name,row.tip, round(row.total_bill,2), color='black', ha="center")
在 着色 上,使用下面的示例,我尝试了以下操作:
import pandas as pd
import seaborn as sns
%matplotlib inline
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',')
groupedvalues=df.groupby('day').sum().reset_index()
pal = sns.color_palette("Greens_d", len(data))
rank = groupedvalues.argsort().argsort()
g=sns.barplot(x='day',y='tip',data=groupedvalues)
for index, row in groupedvalues.iterrows():
g.text(row.name,row.tip, round(row.total_bill,2), color='black', ha="center")
但是这给了我以下错误:
AttributeError:'DataFrame'对象没有属性'argsort'
所以我尝试了修改:
import pandas as pd
import seaborn as sns
%matplotlib inline
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',')
groupedvalues=df.groupby('day').sum().reset_index()
pal = sns.color_palette("Greens_d", len(data))
rank=groupedvalues['total_bill'].rank(ascending=True)
g=sns.barplot(x='day',y='tip',data=groupedvalues,palette=np.array(pal[::-1])[rank])
然后离开了我
IndexError:索引4超出了轴0的大小为4
答案 0 :(得分:19)
让我们坚持链接问题(Changing color scale in seaborn bar plot)的解决方案。您想使用argsort来确定用于着色条的颜色顺序。在链接的问题中,argsort应用于Series对象,它可以正常工作,而在这里你有一个DataFrame。因此,您需要选择该DataFrame的一列来应用argsort。
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
df = sns.load_dataset("tips")
groupedvalues=df.groupby('day').sum().reset_index()
pal = sns.color_palette("Greens_d", len(groupedvalues))
rank = groupedvalues["total_bill"].argsort().argsort()
g=sns.barplot(x='day',y='tip',data=groupedvalues, palette=np.array(pal[::-1])[rank])
for index, row in groupedvalues.iterrows():
g.text(row.name,row.tip, round(row.total_bill,2), color='black', ha="center")
plt.show()
<小时/> 第二次尝试也很好,唯一的问题是
rank()
返回的排名从1
开始而不是零。所以必须从数组中减去1。同样,对于索引,我们需要整数值,因此我们需要将其强制转换为int
。
rank = groupedvalues['total_bill'].rank(ascending=True).values
rank = (rank-1).astype(np.int)
答案 1 :(得分:8)
plt.figure(figsize=(15,10))
graph = sns.barplot(x='name_column_x_axis', y="name_column_x_axis", data = dataframe_name , color="salmon")
for p in graph.patches:
graph.annotate('{:.0f}'.format(p.get_height()), (p.get_x()+0.3, p.get_height()),
ha='center', va='bottom',
color= 'black')
答案 2 :(得分:7)
使用单个斧头或斧头矩阵(子图)
<input type="file" id="file" onChange="fileChange()"/>
答案 3 :(得分:4)
现在有一个内置的 Axes.bar_label
来自动标记酒吧容器,所以现在标记变成了单行:
ax = sns.barplot(x='day', y='tip', data=groupedvalues)
ax.bar_label(ax.containers[0])
为了完整起见,对于颜色排名版本,这里是使用 Series.rank
和 Series.sub
的 Ernest 代码的稍微修改版本:
rank = groupedvalues.total_bill.rank().sub(1).astype(int)
palette = np.array(sns.color_palette('Blues_d', len(rank)))[rank]
ax = sns.barplot(x='day', y='tip', palette=palette, data=groupedvalues)
ax.bar_label(ax.containers[0])
答案 4 :(得分:2)
希望这有助于第2项: a)您可以按总账单排序,然后将索引重置为此列 b)使用palette =“Blue”使用此颜色将图表从浅蓝色缩放为深蓝色(如果深蓝色变为浅蓝色,则使用palette =“Blues_d”)
import pandas as pd
import seaborn as sns
%matplotlib inline
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',')
groupedvalues=df.groupby('day').sum().reset_index()
groupedvalues=groupedvalues.sort_values('total_bill').reset_index()
g=sns.barplot(x='day',y='tip',data=groupedvalues, palette="Blues")
答案 5 :(得分:1)
为了防止有人对水平条形图标注感兴趣,我对Sharon's answer进行了如下修改:
def show_values_on_bars(axs, h_v="v", space=0.4):
def _show_on_single_plot(ax):
if h_v == "v":
for p in ax.patches:
_x = p.get_x() + p.get_width() / 2
_y = p.get_y() + p.get_height()
value = int(p.get_height())
ax.text(_x, _y, value, ha="center")
elif h_v == "h":
for p in ax.patches:
_x = p.get_x() + p.get_width() + float(space)
_y = p.get_y() + p.get_height()
value = int(p.get_width())
ax.text(_x, _y, value, ha="left")
if isinstance(axs, np.ndarray):
for idx, ax in np.ndenumerate(axs):
_show_on_single_plot(ax)
else:
_show_on_single_plot(axs)
解释了两个参数:
h_v
-条形图是水平的还是垂直的。 "h"
代表水平条形图,"v"
代表垂直条形图。
space
-值文本和条的顶部边缘之间的间隔。仅适用于水平模式。
示例:
show_values_on_bars(sns_t, "h", 0.3)
答案 6 :(得分:0)
一种简单的方法是添加以下代码(适用于Seaborn):
@import "../../scss/_variables.scss";
示例:
for p in splot.patches:
splot.annotate(format(p.get_height(), '.1f'),
(p.get_x() + p.get_width() / 2., p.get_height()),
ha = 'center', va = 'center',
xytext = (0, 9),
textcoords = 'offset points')
答案 7 :(得分:0)
import seaborn as sns
fig = plt.figure(figsize = (12, 8))
ax = plt.subplot(111)
ax = sns.barplot(x="Knowledge_type", y="Percentage", hue="Distance", data=knowledge)
for p in ax.patches:
ax.annotate(format(p.get_height(), '.2f'), (p.get_x() + p.get_width() / 2., p.get_height()),
ha = 'center', va = 'center', xytext = (0, 10), textcoords = 'offset points')