Python Matplotlib:根据条件在条形图中标识条形图
代码如下:Python Matplotlib:根据条件在条形图中标识条形图,python,pandas,matplotlib,bar-chart,Python,Pandas,Matplotlib,Bar Chart,代码如下: import pandas as pd import matplotlib.pyplot as plt data = [['Apple',10],['Banana',15],['Kiwi',11],['Orange',17]] df = pd.DataFrame(data,columns=['Fruit','Quantity']) df.set_index('Fruit', inplace=True) df.plot.bar(color='gray',rot=0) plt.show
import pandas as pd
import matplotlib.pyplot as plt
data = [['Apple',10],['Banana',15],['Kiwi',11],['Orange',17]]
df = pd.DataFrame(data,columns=['Fruit','Quantity'])
df.set_index('Fruit', inplace=True)
df.plot.bar(color='gray',rot=0)
plt.show()
提供以下输出:
我想用红色绘制两个数量最多的水果条,即橙色和香蕉。我该怎么做?与其给一个固定的阈值来改变颜色,我更希望我的绘图足够健壮,能够识别顶部的两个条。可能有一种简单直接的方法,但我能够想出以下解决方案,原则上适用于任意数量的顶部
n
值。这个想法是:
- 首先使用
从数据帧中获取顶部nlargest
元素(n
)n=2
- 然后,在x-tick标签上循环,并使用
语句更改最大值的面片(条)的颜色,以获取它们的索引。在这里,我们创建了一个axis实例if
,以便能够提取用于设置颜色的面片ax
绘制彩色条形图 问题在于,pandas条形图采用
color
参数来按列应用。这里只有一列。因此,类似于为条形图着色的规范尝试不起作用
pd.DataFrame([12,14]).plot.bar(color=["red", "green"])
一种解决方法是创建一个对角矩阵,而不是一列,并使用stacked=True
选项绘制它
df = pd.DataFrame([12,14])
df = pd.DataFrame(np.diag(df[0].values), index=df.index, columns=df.index)
df.plot.bar(color=["red", "green"], stacked=True)
另一个选项是使用matplotlib
df = pd.DataFrame([12,14])
plt.bar(df.index, df[0].values, color=color)
根据值选择颜色
现在的问题仍然是如何创建一个在上述两种解决方案中使用的颜色列表。给定一个数据帧df
,您可以创建一个与该帧长度相等的数组,并用默认颜色填充该数组,然后可以将两个最高值的条目设置为另一种颜色:
color = np.array(["gray"]*len(df))
color[np.argsort(df["Quantity"])[-2:]] = "red"
解决方案:
color = np.array(["gray"]*len(df))
color[np.argsort(df["Quantity"])[-2:]] = "red"
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = [['Apple',10],['Banana',15],['Kiwi',11],['Orange',17]]
df = pd.DataFrame(data,columns=['Fruit','Quantity'])
df.set_index('Fruit', inplace=True)
color = np.array(["gray"]*len(df))
color[np.argsort(df["Quantity"])[-2:]] = "red"
plt.bar(df.index, df.values, color=color)
plt.show()