Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Seaborn条形图-显示值_Python_Pandas_Matplotlib_Seaborn - Fatal编程技术网

Python Seaborn条形图-显示值

Python Seaborn条形图-显示值,python,pandas,matplotlib,seaborn,Python,Pandas,Matplotlib,Seaborn,我想看看如何在Seaborn中使用条形图来显示数据框中的值,而不是图形中的值 1我希望在绘制另一个字段的同时显示数据帧中一个字段的值。例如,在下面,我画的是“小费”,但我想把“总账单”的值放在每个横条的中心,即周五上方325.88, 星期六以上1778.40等 2是否有一种方法可以缩放条的颜色,在本例中,最低值的“total_bill”颜色最浅,最高值的“total_bill”颜色最深。显然,当我进行缩放时,我会坚持使用一种颜色,即蓝色 谢谢!我相信这很容易,但我错过了 虽然我看到其他人认为这是

我想看看如何在Seaborn中使用条形图来显示数据框中的值,而不是图形中的值

1我希望在绘制另一个字段的同时显示数据帧中一个字段的值。例如,在下面,我画的是“小费”,但我想把“总账单”的值放在每个横条的中心,即周五上方325.88, 星期六以上1778.40等

2是否有一种方法可以缩放条的颜色,在本例中,最低值的“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])
这就给我留下了


索引器:索引4超出大小为4的轴0的界限,希望这对项目2有所帮助: a您可以按账单总额排序,然后将索引重置到此列 b使用调色板=蓝色使用此颜色将图表从浅蓝色缩放到深蓝色,如果是深蓝色到浅蓝色,则使用调色板=蓝色

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")

让我们继续使用链接问题的解决方案。您需要使用argsort来确定用于为条形图着色的颜色顺序。在链接问题中,argsort应用于一个Series对象,这很好,而这里有一个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


适用于单ax或ax子批次矩阵

from matplotlib import pyplot as plt
import numpy as np

def show_values_on_bars(axs):
    def _show_on_single_plot(ax):        
        for p in ax.patches:
            _x = p.get_x() + p.get_width() / 2
            _y = p.get_y() + p.get_height()
            value = '{:.2f}'.format(p.get_height())
            ax.text(_x, _y, value, ha="center") 

    if isinstance(axs, np.ndarray):
        for idx, ax in np.ndenumerate(axs):
            _show_on_single_plot(ax)
    else:
        _show_on_single_plot(axs)

fig, ax = plt.subplots(1, 2)
show_values_on_bars(ax)

为了防止任何人对标记水平条形图感兴趣,我修改如下:

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表示垂直条形图

空格-值文本与栏顶边缘之间的空格。仅适用于水平模式

例如:


一种简单的方法是为Seaborn添加以下代码:

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') 
例如:

splot = sns.barplot(df['X'], df['Y'])
# Annotate the bars in plot
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')    
plt.show()

在发布问题之前,你真的在寻找解决方案吗?是一种在条形图上设置标签的方法,也是一种更改条形图颜色的方法。如果您在实施任何一种解决方案时遇到问题,您可以问一个具体的问题。请再次尝试通过示例。。我会回来的。。泰。如果我弄明白了,我会发布答案吗?我会为标签提出一个可能的想法。。明暗处理仍然漏掉了米德上面的很多细节和代码。。似乎再也走不远了。。您仍然可以按照绘图中显示的条形图的顺序应用调色板。链接问题中也提出了这样一个想法,即按照与已排序的总账单列相同的顺序对颜色进行排序,这样总账单最大的列的颜色最深。是的,你是对的。直到看到你的帖子,我才意识到这个问题与我对它的理解不同。谢谢非常有用。谢谢令人惊叹的知道如何自动更新y轴限制以提供足够的文本空间吗?太好了,thnxWorks非常有魅力!我唯一要添加的是一个水平条形图的va=中心。效果很好。。。感谢添加以下内容可能会很有用:value=0(如果np.isnanp.get_height else intp.get_height),value=0(如果np.isnanp.get_width else intp.get_width else intp.get_width)以了解如何计算标签值(如果条大小为空)。这是非常有用的,就像一个魅力!非常感谢:-张正割非常感谢!
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')
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') 
splot = sns.barplot(df['X'], df['Y'])
# Annotate the bars in plot
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')    
plt.show()
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')