根据y值以降序绘制两个列表

时间:2018-01-28 05:36:31

标签: python matplotlib

我有两个清单。第一个是字符串列表a

['Agriculture/Forestry/Fisheries/Veterinary Medicine',
 'Architectural and Town Planning',
 'Business Administration and Related', ...]

和第二个浮动列表b

[66667.0,
22283.0,
670091.5, ...]

当我使用以下代码绘制它时

import matplotlib.pyplot as plt
%matplotlib inline

a = ['Agriculture/Forestry/Fisheries/Veterinary Medicine',
'Architectural and Town Planning',
'Business Administration and Related', ...]
b = [66667.0,
22283.0,
670091.5, ...]

fig = plt.figure()
ax = fig.add_subplot(111)
ax.bar(a,b)
plt.xticks(rotation=90)

根据列表a中的字符串,字符串按字母顺序排列。 我如何绘制它以使条形相对于列表b按降序排列?

3 个答案:

答案 0 :(得分:1)

简单的数据重新排列方法:

import matplotlib.pyplot as plt

a = [
    'Agriculture/Forestry/Fisheries/Veterinary Medicine',
    'Architectural and Town Planning',
    'Business Administration and Related'
]

b = [66667.0, 22283.0, 670091.5]

b, a = zip(*sorted(zip(b, a), reverse=True))  # reverse sort data on 'b'

c = range(len(b))

fig = plt.figure()
ax = fig.add_subplot(111)
ax.bar(c, b)
plt.xticks(c, a, rotation=90)
plt.show()

enter image description here

答案 1 :(得分:0)

这是你想要做的事情:

import matplotlib.pyplot as plt
import pandas as pd
%matplotlib inline

categories = ['Agriculture/Forestry/Fisheries/Veterinary Medicine',
 'Architectural and Town Planning',
 'Business Administration and Related']

values = [66667.0,22283.0,670091.5]

df = pd.DataFrame(columns=['category', 'value'])
df = df.append([{"category":a, "value":b} for a, b in zip(categories, values)])

df.sort_values('value', ascending=False)[['category','value']].plot.bar()

enter image description here

答案 2 :(得分:0)

使用numpy

  • list(zip(list_name, list_count))将两个列表压缩成一个元组列表
    • 使用dtypes将元组列表转换为np.array
  • np.sort按升序排序(从最小到最大)
  • [::-1]反转数组
  • 好处是,matplotlib可以轻松接受数组,并且numpy列可以使用其名称进行传递。
import numpy as np
import matplotlib.pyplot as plt

text = ['Agriculture/Forestry/Fisheries/Veterinary Medicine', 'Architectural and Town Planning', 'Business Administration and Related']

values = [66667.0, 22283.0, 670091.5]

# get the length of the longest string in text, for the numpy str dtype
# this is only necessary if make sure the entire string is included in the array
str_len = max([len(t) for t in text])

# create numpy array with dtypes
t = np.array(list(zip(text, values)), dtype = [('text', f'S{str_len}'), ('values', int)])

# sort array
t = np.sort(t, order=['values'])[::-1]

# plot
plt.bar(x=t['text'], height=t['values'])
plt.xticks(rotation=90)

enter image description here