我是靠谱客的博主 冷艳糖豆,最近开发中收集的这篇文章主要介绍python的柱形图两根柱子之间的距离大小,在matplotlib中设置分组条形图之间的间距...,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

I'm trying to make a grouped bar plot in matplotlib, following the example in the gallery. I use the following:

import matplotlib.pyplot as plt

plt.figure(figsize=(7,7), dpi=300)

xticks = [0.1, 1.1]

groups = [[1.04, 0.96],

[1.69, 4.02]]

group_labels = ["G1", "G2"]

num_items = len(group_labels)

ind = arange(num_items)

width = 0.1

s = plt.subplot(1,1,1)

for num, vals in enumerate(groups):

print "plotting: ", vals

group_len = len(vals)

gene_rects = plt.bar(ind, vals, width,

align="center")

ind = ind + width

num_groups = len(group_labels)

# Make label centered with respect to group of bars

# Is there a less complicated way?

offset = (num_groups / 2.) * width

xticks = arange(num_groups) + offset

s.set_xticks(xticks)

print "xticks: ", xticks

plt.xlim([0 - width, max(xticks) + (num_groups * width)])

s.set_xticklabels(group_labels)

tpn37.png

My questions are:

How can I control the space between the groups of bars? Right now the spacing is huge and it looks silly. Note that I do not want to make the bars wider - I want them to have the same width, but be closer together.

How can I get the labels to be centered below the groups of bars? I tried to come up with some arithmetic calculations to position the xlabels in the right place (see code above) but it's still slightly off... it feels a bit like writing a plotting library rather than using one. How can this be fixed? (Is there a wrapper or built in utility for matplotlib where this is default behavior?)

EDIT: Reply to @mlgill: thank you for your answer. Your code is certainly much more elegant but still has the same issue, namely that the width of the bars and the spacing between the groups are not controlled separately. Your graph looks correct but the bars are far too wide -- it looks like an Excel graph -- and I wanted to make the bar thinner.

Width and margin are now linked, so if I try:

margin = 0.60

width = (1.-2.*margin)/num_items

It makes the bar skinnier, but brings the group far apart, so the plot again does not look right.

How can I make a grouped bar plot function that takes two parameters: the width of each bar, and the spacing between the bar groups, and plots it correctly like your code did, i.e. with the x-axis labels centered below the groups?

I think that since the user has to compute specific low-level layout quantities like margin and width, we are still basically writing a plotting library :)

解决方案

The trick to both of your questions is understanding that bar graphs in Matplotlib expect each series (G1, G2) to have a total width of "1.0", counting margins on either side. Thus, it's probably easiest to set margins up and then calculate the width of each bar depending on how many of them there are per series. In your case, there are two bars per series.

Assuming you left align each bar, instead of center aligning them as you had done, this setup will result in series which span from 0.0 to 1.0, 1.0 to 2.0, and so forth on the x-axis. Thus, the exact center of each series, which is where you want your labels to appear, will be at 0.5, 1.5, etc.

I've cleaned up your code as there were a lot of extraneous variables. See comments within.

import matplotlib.pyplot as plt

import numpy as np

plt.figure(figsize=(7,7), dpi=300)

groups = [[1.04, 0.96],

[1.69, 4.02]]

group_labels = ["G1", "G2"]

num_items = len(group_labels)

# This needs to be a numpy range for xdata calculations

# to work.

ind = np.arange(num_items)

# Bar graphs expect a total width of "1.0" per group

# Thus, you should make the sum of the two margins

# plus the sum of the width for each entry equal 1.0.

# One way of doing that is shown below. You can make

# The margins smaller if they're still too big.

margin = 0.05

width = (1.-2.*margin)/num_items

s = plt.subplot(1,1,1)

for num, vals in enumerate(groups):

print "plotting: ", vals

# The position of the xdata must be calculated for each of the two data series

xdata = ind+margin+(num*width)

# Removing the "align=center" feature will left align graphs, which is what

# this method of calculating positions assumes

gene_rects = plt.bar(xdata, vals, width)

# You should no longer need to manually set the plot limit since everything

# is scaled to one.

# Also the ticks should be much simpler now that each group of bars extends from

# 0.0 to 1.0, 1.0 to 2.0, and so forth and, thus, are centered at 0.5, 1.5, etc.

s.set_xticks(ind+0.5)

s.set_xticklabels(group_labels)

ur3ig.png

最后

以上就是冷艳糖豆为你收集整理的python的柱形图两根柱子之间的距离大小,在matplotlib中设置分组条形图之间的间距...的全部内容,希望文章能够帮你解决python的柱形图两根柱子之间的距离大小,在matplotlib中设置分组条形图之间的间距...所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部