Bax*_*ter 9 python matplotlib data-science
所以我在这里看到了一些有帮助的答案,但我的数据集比之前回答的数据集要大。为了让您了解我正在使用的内容,这里有一个完整数据集的链接。我提供了一张尝试解决方案的图片,可以在此链接中找到该解决方案:
。
问题是 1. 这很难阅读,2. 我不知道如何将其展平,使其看起来像传统的时间线。当我尝试处理更大的片段时,这个问题变得更加明显,比如这个,它基本上是不可读的:
这是我用来生成这两个代码的代码(我刚刚修改了包含的代码以更改使用整个数据集的哪个部分)。
event = Xia['EnglishName']
begin = Xia['Start']
end = Xia['Finish']
length = Xia['Length']
plt.figure(figsize=(12,6))
plt.barh(range(len(begin)), (end-begin), .3, left=begin)
plt.tick_params(axis='both', which='major', labelsize=15)
plt.tick_params(axis='both', which='minor', labelsize=20)
plt.title('Xia Dynasty', fontsize = '25')
plt.xlabel('Year', fontsize = '20')
plt.yticks(range(len(begin)), "")
plt.xlim(-2250, -1750)
plt.ylim(-1,18)
for i in range(18):
plt.text(begin.iloc[i] + length.iloc[i]/2, i+.25, event.iloc[i], ha='center', fontsize = '12')
Run Code Online (Sandbox Code Playgroud)
这段代码半有效,但我更喜欢条形图要么距离更近,要么颜色不同,并且都在相同的 y 值上。我感谢任何和所有的帮助。我已经尝试解决这个问题大约两周了,但遇到了困难。
ram*_*.pm 16
我不知道你是否已经解决了这个问题,但是,从我迄今为止从你的代码中看到的以及(也借用了 Evgeny 的代码)你的要求来看,你有不同级别的水平条的唯一原因是因为你将matplotlib ( ) 的 barh 的标量ymatplotlib.pyplot.barh(y, width, height=0.8, left=None, *, align='center', **kwargs定义为范围。因此,每个连续的堆叠条都列在单独的级别上。
因此,我冒昧地下载了您的数据集并稍微尝试了一下代码。
我从 google 数据集创建了一个数据框,并为每个 Dynasty(Dynasty_col 列)和 Age(Age_col 列)分配了 matplotlib CSS 颜色(这不是必需的,但是,我发现这更容易管理可视化):

接下来,我主要保留了您/Evgeny 的代码已经显示的内容,并进行了一些细微的更改:
event = data_set_xia['EnglishName']
begin = data_set_xia['Start']
end = data_set_xia['Finish']
length = data_set_xia['Length']
Run Code Online (Sandbox Code Playgroud)
这里我添加了一个用竖线命名的级别(可以加长或缩短数组[-2, 2, -1, 1]来获得不同级别的标签):
levels = np.tile([-2, 2, -1, 1],
int(np.ceil(len(begin)/4)))[:len(begin)]
import matplotlib.pyplot as plt
plt.style.use('ggplot')
plt.figure(figsize=(12,6))
Run Code Online (Sandbox Code Playgroud)
在这里,我基本上将所有王朝添加到同一y标量(列为 0),该行的其余部分已修改为对应于条形的颜色并给出边缘颜色。
plt.barh(0, (end-begin), color=data_set_xia.loc[:,"Dynasty_col"], height =0.3 ,left=begin, edgecolor = "black")
plt.tick_params(axis='both', which='major', labelsize=15)
plt.tick_params(axis='both', which='minor', labelsize=20)
plt.title('Xia Dynasty', fontsize = '25')
plt.xlabel('Year', fontsize = '20')
# plt.yticks(range(len(begin)), "")
ax = plt.gca()
ax.axes.yaxis.set_visible(False)
plt.xlim(-2250, -1700)
plt.ylim(-5,5)
Run Code Online (Sandbox Code Playgroud)
我用垂直线作为标签进行了一些尝试,并将标签与创建绘图的级别相关联。
plt.vlines(begin+length/2, 0, levels, color="tab:red")
for i in range(18):
plt.text(begin.iloc[i] + length.iloc[i]/2,
levels[i]*1.3, event.iloc[i],
ha='center', fontsize = '12')
plt.tight_layout()
plt.show()
Run Code Online (Sandbox Code Playgroud)
显然,条目数量越长,图表就会变得越繁忙、越混乱,看起来有点难看,但仍然清晰可辨。另外,代码并不“完美”,我会稍微清理一下并更改一些命令选项,例如barh 中参数中的颜色,但它现在可以使用。
对于替代表示,我添加了按时间交错表示不同朝代的代码,因为某些朝代相互重叠:
event = data_set_adj['EnglishName']
begin = data_set_adj['Start']
end = data_set_adj['Finish']
length = data_set_adj['Length']
dynasty = data_set_adj['Dynasty']
dynasty_col = data_set_adj['Dynasty_col']
dict_dynasty = dict(zip(dynasty.unique(), range(0,4*len(dynasty.unique()),4)))
levels = np.tile([-1.2,1.2, -0.8, 0.8, -0.4, 0.4],
int(np.ceil(len(begin)/6)))[:len(begin)]
import matplotlib.pyplot as plt
plt.style.use('ggplot')
plt.figure(figsize=(20,10))
for x in range(len(dynasty)):
plt.vlines(begin.iloc[x]+length.iloc[x]/2, dict_dynasty[dynasty.iloc[x]], dict_dynasty[dynasty.iloc[x]]+levels[x], color="tab:red")
plt.barh(dict_dynasty[dynasty.iloc[x]], (end.iloc[x]-begin.iloc[x]), color=dynasty_col.iloc[x], height =0.3 ,left=begin.iloc[x], edgecolor = "black", alpha = 0.5)
if x%2==0:
plt.text(begin.iloc[x] + length.iloc[x]/2,
dict_dynasty[dynasty.iloc[x]]+1.6*levels[x], event.iloc[x],
ha='center', fontsize = '8')
else:
plt.text(begin.iloc[x] + length.iloc[x]/2,
dict_dynasty[dynasty.iloc[x]]+1.25*levels[x], event.iloc[x],
ha='center', fontsize = '8')
plt.tick_params(axis='both', which='major', labelsize=15)
plt.tick_params(axis='both', which='minor', labelsize=20)
plt.title('Chinese Dynasties', fontsize = '25')
plt.xlabel('Year', fontsize = '20')
ax = plt.gca()
ax.axes.yaxis.set_visible(False)
plt.xlim(900, 1915)
plt.ylim(-4,28)
plt.tight_layout()
plt.show()
Run Code Online (Sandbox Code Playgroud)
最后一部分是仓促完成的,所以代码不是最简洁的,但我在这里唯一改变的是根据我正在考虑的数据子集中的王朝更新 barh 的y标量。为了便于阅读,我修改了级别和字体大小,您可以使用数字和代码来获得适当的表示形式。
另外,当我添加 Age_col 列时,您可以将整个内容分类为前帝国和帝国(红色或蓝色)。我暂时没有附上任何图表,但如果你在王朝周围添加一个带有不同“zorder”的颜色补丁,那就有效了。
对于可缩放和平移的图形,我想使用散景或其他类似的绘图库会更好,这样,您可以保持它整洁并专注于有意义的部分?