【问题标题】:Create clustered bar chart across two columns in bokeh在散景中跨两列创建聚集条形图
【发布时间】:2017-01-24 07:16:37
【问题描述】:

我有一个如下所示的数据框:

       type    price1     price2
0        A     5450.0     31980.0
1        B     5450.0     20000.0
2        C     15998.0    18100.0

我想要的是绘制“类型”与“价格”的聚集条形图。最终目标是一个图表,每种类型都有两个柱,一个柱用于“price1”,另一个柱用于“price2”。两列的单位相同 ($)。使用 Bokeh 我可以按类型分组,但我似乎无法按通用“价格”单位分组。到目前为止我有这个代码:

import pandas as pd
import numpy as np
from bokeh.charts import Bar, output_file, show
from bokeh.palettes import Category20 as palette
from bokeh.models import HoverTool, PanTool
p = Bar(
        df,
        plot_width=1300,
        plot_height=900,
        label='type',
        values='price2',
        bar_width=0.4,
        legend='top_right',
        agg='median',
        tools=[HoverTool(), PanTool()],
        palette=palette[20])

但这只会让我为每种类型提供一列。

如何修改我的代码以使每种类型有两个条形图?

【问题讨论】:

  • 请帮我解决这个问题
  • 一件小事,我无法导入您正在使用的调色板。 ImportError: cannot import name Category20hover 应该是 HoverTool()
  • @Khris 对不起,我把悬停工具实例化了。更新。至于调色板,你用的是什么版本的散景?

标签: python pandas data-visualization bokeh


【解决方案1】:

您正在搜索的是grouped Bar 情节。

但是您必须稍微重新组织您的数据,以便散景(或更好的 Pandas)能够正确地对数据进行分组。

df2 = pd.DataFrame(data={'type': ['A','B','C', 'A', 'B', 'C'],
          'price':[5450, 5450, 15998, 3216, 20000, 15000],
          'price_type':['price1', 'price1', 'price1', 'price2', 'price2', 'price2']})

p = Bar(
        df2,
        plot_width=1300,
        plot_height=900,
        label='type',
        values='price',
        bar_width=0.4,
        group='price_type',
        legend='top_right')
  show(p)

【讨论】:

  • 我明白了,谢谢。但我在以这种方式组织我的数据时遇到了问题。 price_type 是列的属性,而不是行的属性。你的组织是后者。
  • 使用高级条形图似乎无法实现您想要的效果,您可能需要使用较低级别的散景或使用不同的库创建绘图并将其导入散景,如所述这里:bokeh.pydata.org/en/latest/docs/user_guide/…
  • 当你有一个 pandas 数据框时,你可以随时重新组织它,直到它符合你的要求,这就是它们的目的。 (检查重塑/枢轴)。剧情是你想要的吗?
【解决方案2】:

您的表格是“宽”格式。您想首先使用 pd.melt() 函数将其融化为长格式。对于可视化,我建议你使用“Seaborn”包,让你的生活更轻松。您可以在一行中可视化所有内容。

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

your_df = pd.DataFrame(data={'type': ['A','B','C'],
      'price1':[5450, 5450, 15998],
      'price2' : [3216, 20000, 15000]})

long_df = pd.melt(your_df,id_vars = ['type'],value_vars =['price1','price2'])
print long_df

my_plot = sns.barplot(x="type", y="value",hue = "variable", data=long_df)
sns.plt.show()

可以在此处找到有关长格式和宽格式的好帖子: Reshape Long Format Multivalue Dataframes with Pandas

如果你坚持使用散景,就像renzop指出的那样:

p = Bar(long_df,
    plot_width=1000,
    plot_height=800,
    label='type',
    values='value',
    bar_width=0.4,
    group='variable',
    legend='top_right')

show(p)

【讨论】:

  • 是的,因为熔化功能或条形图是由renzop发明的。我什至没有检查那个答案,否则我会把功劳归功于他。这只是常规的做法。
  • 我的意思是他在 cmets 中有 df2 的长格式和宽格式参数。该帖子显示了 df2 中某些值的重复,这不是解决此问题的系统方法。我发现@renzop 在他的帖子下方的 cmets 中也谈到了 melt()。
  • Sohrab 的回答实际上显示了melt 函数的用法,而renzop 没有。这对我更有帮助,因为我对熊猫的经验很少。
猜你喜欢
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多