Python:条形图根据第三个变量着色

奥尼尔·默里

目前,我正在尝试创建一个Barplot,以显示一个应用程序每周的评论量。但是,应该根据第三个变量对条进行着色,该变量包含每周评论的平均评分(范围:1到5)。

我按照以下帖子的说明创建了图形:Python:带有colorbar的Barplot

该代码工作正常:

# Import Packages
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.cm import ScalarMappable 

# Create Dataframe
data = [[1, 10, 3.4], [2, 15, 3.9], [3, 12, 3.6], [4, 30,1.2]] 
df = pd.DataFrame(data, columns = ["week", "count", "score"])

# Convert to lists
data_x = list(df["week"])
data_hight = list(df["count"])
data_color = list(df["score"])

#Create Barplot:
data_color = [x / max(data_color) for x in data_color]
fig, ax = plt.subplots(figsize=(15, 4))

my_cmap = plt.cm.get_cmap('RdYlGn')
colors = my_cmap(data_color)
rects = ax.bar(data_x, data_hight, color=colors)

sm = ScalarMappable(cmap=my_cmap, norm=plt.Normalize(1,5))
sm.set_array([])

cbar = plt.colorbar(sm)
cbar.set_label('Color', rotation=270,labelpad=25)

plt.show()

条形图

现在开始问题:您可能已经注意到,第4周的平均得分值为“ 1.2”。但是,Barplot确实表明该值位于“ 2.5”附近。我知道这源于以下代码行,该代码行通过将其除以最大值来标准化值:

data_color = [x / max(data_color) for x in data_color]

不幸的是,我无法以类似于分数的绝对值的颜色来更改此命令,例如,平均分数为1.2时,最后一个小节应显示为深红色而不是浅橙色。我试图插入常规分数值(未标准化)来解决该问题,但是,这样做会创建具有相同绿色的所有条形...由于这只是我的第二个python项目,因此我很难理解这个问题背后的过程,非常感谢您提出任何建议或解决方案。

干杯尼尔

T先生

您已正确确定归一化是这里的问题。它在链接代码中由为interval定义的值SO用户@ImportanceOfBeingEarnest定义[0, 1]如果需要另一个规范化范围[normmin, normmax],则必须在规范化过程中将其考虑在内:

# Import Packages
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.cm import ScalarMappable 

# Create Dataframe
data = [[1, 10, 3.4], [2, 15, 3.9], [3, 12, 3.6], [4, 30,1.2]] 
df = pd.DataFrame(data, columns = ["week", "mycount", "score"])
  
# Not necessary to convert to lists, pandas series or numpy array is also fine
data_x = df.week
data_hight = df.mycount
data_color = df.score

#Create Barplot:
normmin=1
normmax=5
data_color = [(x-normmin) / (normmax-normmin) for x in data_color] #see the difference here
fig, ax = plt.subplots(figsize=(15, 4))

my_cmap = plt.cm.get_cmap('RdYlGn')
colors = my_cmap(data_color)
rects = ax.bar(data_x, data_hight, color=colors)

sm = ScalarMappable(cmap=my_cmap, norm=plt.Normalize(normmin,normmax))
sm.set_array([])

cbar = plt.colorbar(sm)
cbar.set_label('Color', rotation=270,labelpad=25)

plt.show()

样本输出:

在此处输入图片说明

显然,这不会检查所有值是否确实在range内[normmin, normmax],因此更好的脚本将确保所有值都符合此规范。或者,我们可以通过裁剪超出规范化范围的值来解决此问题:

#...
import numpy as np
#.....
#Create Barplot:
normmin=1
normmax=3.5

data_color = [(x-normmin) / (normmax-normmin) for x in np.clip(data_color, normmin, normmax)]
#....

您可能还注意到了我引入的另一项更改。您不必提供列表-pandas系列或numpy数组也可以。并且如果您命名列的方法不像熊猫函数()之类的话count,您可以用df.ABC代替来访问它们df["ABC"]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否有必要交换两个变量而不使用第三个变量?

python ipow:如何使用第三个参数?

根据ggplot中的第三个因素为线图着色

按第三个变量的颜色线-Python

根据颜色图着色的条形图?

根据个别对应元素的比例或第三个列表对Python中的2个列表进行排序

根据第三个变量向ggplot2图添加背景

将第三个变量添加到stat_density_2d图

绘制两个变量,然后用第三个变量着色

具有第三个变量displayng百分比的两个类别变量facet_wrap的ggplot 2的条形图

将第三个子图居中于第二行python的中间

在Python中堆叠来自不同系列的三个条形图

如何在第三个变量中分配2个单独变量的结果?

在Python中重新创建R图-根据第三个值的范围更改颜色

R:使用三个分类变量创建高级条形图,并在图的底部附加汇总表

使用R中的三个分类变量绘制条形图

Python-矩阵,两个变量的和取决于第三个

如何遍历第三个变量?

使用Java中的第三个变量交换

如何根据第三个变量更新频率表?

在数据点的颜色取决于未绘制的第三个变量的python子图中添加颜色条

替换第三个值

由一个变量分隔并由另一个变量着色的条形图

如何根据第三个变量的模态乘以分析?

如何根据python中3d条形图的最高和最低或某个截止值为变量着色

Python:根据第三个数组对两个数组进行排序

Boxplot 两个变量,根据第三个变量的平均值为它们着色

使用连续变量着色条形图 - 因子不起作用

基于python中的第三个变量bin对两个变量进行分组