Y 轴 Matplotlib 上的双标签

我制作了一个顶部带有散点图的条形图。数据大约是 100 本书,出版日期以及作者出生和死亡的年份。barh 显示了作者在世的时间,散点图显示了出版书籍的年份。


我面临的问题是能够在一个栏上绘制多本书。因为我现在有不同的书重复栏。我正在根据数组中的位置创建 y 轴,稍后我将添加标签。


我的相关代码:


# dataframe columns to arrays. (dataset is my pandas dataframe)

begin = np.array(dataset.BORN)

end = np.array(dataset.DIED)

book = np.array(dataset['YEAR (BOOK)'])


# Data to a barh graph (sideways bar)

plt.barh(range(len(begin)), end-begin, left=begin, zorder=2, 

color='#007acc', alpha=0.8, linewidth=5)


# Plots the books in a scatterplot. Changes marker color and shape.

plt.scatter(book, range(len(begin)), color='purple', s=30, marker='D', zorder=3)


# Sets the titles of the y-axis.

plt.yticks(range(len(begin)), dataset.AUTHOR)


# Sets start and end of the x-axis.

plt.xlim([1835, 2019])


# Shows the plt

plt.show()

图片显示了我当前图表的一部分:

http://img1.mukewang.com/6285e1090001337608120932.jpg

慕标5832272
浏览 188回答 3
3回答

慕码人8056858

我会将您的数据集汇总下来,以便您每行使用一个作者groupby并使用它来绘制条形图,然后将其加入以获取用于绘制书籍的值,例如:import pandas as pdimport matplotlib.pyplot as pltdf = pd.DataFrame([    ['foo', 1950, 1990, 1980],    ['foo', 1950, 1990, 1985],    ['bar', 1930, 2000, 1970],], columns=['author', 'born', 'died', 'published'])拉入包并创建一个虚拟数据集,接下来我们将其减少到每个作者一行,获取他们出生和死亡的时间:agg = df.groupby('author')['born', 'died'].agg(min).reset_index()agg['auth_num'] = range(len(agg))使reset_index后面author变成一个普通列,我们创建一个任意auth_num列,sort_values如果您想按作者姓名以外的其他内容对作者进行排序(我建议按字母顺序排列通常不是最有用)接下来,我们可以将其加入原始数据集,以获取每本书的作者编号:df2 = pd.merge(df, agg[['author', 'auth_num']], on='author')最后把它全部绘制出来:plt.barh(agg.auth_num, agg.died - agg.born, left=agg.born, zorder=-1, alpha=0.5)plt.yticks(agg.auth_num, agg.author)plt.scatter(df2.published, df2.auth_num)给出类似的东西:

慕田峪4524236

(下次请包括一个数据框示例!)我会使用很棒的numpy.unique方法来执行分组操作。import numpy as npimport pandas as pdimport matplotlib.pyplot as pltdataset = pd.DataFrame({'BORN': [1900, 1920, 1900],                        'DIED': [1980, 1978, 1980],                        'AUTHOR': ['foo', 'bar', 'foo'],                        'YEAR (BOOK)': [1950, 1972, 1961]})# --group by authorunique_authors, index, reverse_index = np.unique(dataset.AUTHOR.values, return_index=True, return_inverse=True)authors_df = dataset.loc[index, ['AUTHOR', 'BORN', 'DIED']]dataset['AUTHOR_IDX'] = reverse_index  # remember the index# dataframe columns to arrays.begin = authors_df.BORN.valuesend = authors_df.DIED.valuesauthors = authors_df.AUTHOR.values# --Author data to a barh graph (sideways bar)plt.barh(range(len(begin)), end-begin, left=begin, zorder=2, color='#007acc', alpha=0.8, linewidth=5)# Sets the titles of the y-axis.plt.yticks(range(len(begin)), authors)# Sets start and end of the x-axis.plt.xlim([1835, 2019])# --Overlay book information# dataframe columns to arraysbook = dataset['YEAR (BOOK)'].values# Plots the books in a scatterplot. Changes marker color and shape.plt.scatter(book, reverse_index, color='purple', s=30, marker='D', zorder=3)# Shows the pltplt.show()产量:

明月笑刀无情

当然,您可以使用多种选项。您可以为第 1、第 2、第 3 本书创建另一个数组。或者您可以创建一个字典或数组列表来绘制每个作者的书籍。我使用下面的虚拟数据重新生成了一些示例。import matplotlib.pyplot as pltimport numpy as npfig,axs = plt.subplots(1,1,figsize=(10,10))# dataframe columns to arrays. (dataset is my pandas dataframe)begin = np.arange(1900,1950)end = np.arange(1975,2025)# create two random arrays for your book datesbook1 = np.array(np.random.randint(low=1950, high=1970, size=50))book2 = np.array(np.random.randint(low=1950, high=1970, size=50))# add some athor namesauthor_names = [f'Author_{x+1}' for x in range(50)]# Data to a barh graph (sideways bar)axs.barh(range(len(begin)), end-begin, left=begin, zorder=2, color='#007acc', alpha=0.8, linewidth=5)# Plots the books in a scatterplot. Changes marker color and shape.axs.scatter(book1, range(len(begin)), color='purple', s=30, marker='D', zorder=3, label='1st Book')# second array of booksaxs.scatter(book2, range(len(begin)), color='yellow', s=30, marker='D', zorder=3, label='2nd Book')# or plot a custom array of books# you could do this in a for loop for all authorsaxs.scatter(x=[1980,2005], y=[10,45], color='red', s=50, marker='X', zorder=3, label='3rd Book')# Sets the titles of the y-axis.axs.set_yticks(range(len(begin)))axs.set_yticklabels(author_names)# Add legendaxs.legend()# Sets start and end of the x-axis.axs.set_xlim([1895, 2025])axs.set_ylim([-1,50]);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python